浏览 9630 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-21
最后修改:2010-08-02
做个小程序验证一下。 需求 1 自定义的user,role,accessDecisionManager。 2 可以配置url和role的对应关系来做web的访问权限。 s1 在web.xml中配置要应用spring web security.这个配置指明了要应用spring security,以及spring的配置文件位置。 <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/security.xml</param-value> </context-param> <!-- listener setting--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> s2 在security.xml中加入以下片断,主要由两个目的。1是配置用自己定制的AccessDecisionManager来控制web的访问权限。2是配置用自己定制的UserDetailsService来提供用户信息。 <beans:bean class="allen.MyAccessDecisionManager" id="myAccessDecisionManager"> </beans:bean> <http auto-config="true" access-decision-manager-ref="myAccessDecisionManager"> <anonymous enabled="false" /> <intercept-url pattern="/**" access="allen" /> </http> <beans:bean class="allen.MyUserDetailsService" id="myUserDetailsService"> </beans:bean> <authentication-manager> <authentication-provider user-service-ref='myUserDetailsService' /> </authentication-manager> s3 认证相关:自定义了UserDetails private String userName; private String password; private Collection<GrantedAuthority> auths; 自定义了GrantedAuthority,里面只有一个string来表明role. 定制的MyUserDetailsService,该类实现UserDetailsService,用来提供用户信息,可以从任何地方由用户名取到该用户的信息。这里可以返回自定义的UserDetails。在security.xml里面的配置指明了当需要认证时,就可以从这里得到用户信息。 @Override public UserDetails loadUserByUsername(String arg0) throws UsernameNotFoundException, DataAccessException { UserDetails details = UserCache.userCache.getUser(arg0); return details; } s4 授权相关: 自定义了MyAccessDecisionManager,实现了AccessDecisionManager。在security.xml里面的配置指明了当需要授权检查时,MyAccessDecisionManager会做实际的检查工作。 在decide中,可以得到一切和授权相关的东西。如何做取决于我们想怎么做。 这里检查用户的role能不能访问当前访问的url. @Override public void decide(Authentication authentication, Object securityObject, Collection<ConfigAttribute> arg2) throws AccessDeniedException, InsufficientAuthenticationException { if (authentication == null || !authentication.isAuthenticated()) throw new InsufficientAuthenticationException("Not Authenticated"); Object principal = authentication.getPrincipal(); MyUserDetails myUserDetails = (MyUserDetails) principal; Collection<GrantedAuthority> userRoles = authentication .getAuthorities(); String url = null; if (securityObject instanceof FilterInvocation) { FilterInvocation filter = (FilterInvocation) securityObject; url = filter.getRequestUrl(); } if (!URLManager.manager.canAccessUrl(url, userRoles)) { throw new AccessDeniedException("Role check fails."); } } 小结:spring的web security还是很和谐的。扩展很容易。用着挺舒服。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-12
很好的学习材料,以前看源程序时不懂的东西,现在很好理解了
|
|
返回顶楼 | |
发表时间:2010-05-07
学习了。Spring Security,权限相关,我也想使用,不用老是自己写。
|
|
返回顶楼 | |
发表时间:2010-05-09
allen什么意思?我照着配出错了
|
|
返回顶楼 | |
发表时间:2010-05-11
西门吹牛 写道 allen什么意思?我照着配出错了
allen是包名吧 |
|
返回顶楼 | |
发表时间:2010-05-11
我用的还是security2.0.5 的版本,感觉用起来还可以。再配合ACL,用起来就更好了,等有时间再把ACL 用起来试试
|
|
返回顶楼 | |
发表时间:2010-05-12
最后修改:2010-05-12
最近在看这个东西,累啊。
验证那块已经熟悉了,为了练手,自己实现了UserDetails,自己写的UserDetailsService,自己实现的AuthenticationProvider。登陆页面也是自己弄的(我真的很讨厌j_username和j_password)这两个名字:( 下一步研究授权,正在跟踪过滤器调用链。 准备拿掉一些没用的东东,比如那个basic,想不出来什么地方会用到。还有那个匿名xxx的。还有想要支持验证码好像得自己写过滤器插进去了吧(隐约听说有个现成的东东,不过项目的头已经失踪好久了。。。。) |
|
返回顶楼 | |
发表时间:2010-06-10
不知道大家有没有注意过,如果自定义的一个类去实现 UserDetails ,自定义的类 又关联了另一个 实体类 (比如 group ),当从 SecurityContextHolder.getContext().getAuthentication().getPrincipal() 获得 用户信息时,通过 上下文返回的对象获取关联的group 对象有问题,一直没想明白。
|
|
返回顶楼 | |
发表时间:2010-06-13
angjunwen 写道 不知道大家有没有注意过,如果自定义的一个类去实现 UserDetails ,自定义的类 又关联了另一个 实体类 (比如 group ),当从 SecurityContextHolder.getContext().getAuthentication().getPrincipal() 获得 用户信息时,通过 上下文返回的对象获取关联的group 对象有问题,一直没想明白。
你还别说,我就是这么弄得,你出啥问题了,我用的一点问题都没有!!! |
|
返回顶楼 | |