论坛首页 Java企业应用论坛

Spring Web Security3.0 初体验

浏览 9604 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-21   最后修改:2010-08-02
看了看Spring Web Security3.0,感觉架构很和谐。
做个小程序验证一下。
需求
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还是很和谐的。扩展很容易。用着挺舒服。
   发表时间:2010-04-12  
很好的学习材料,以前看源程序时不懂的东西,现在很好理解了
0 请登录后投票
   发表时间:2010-05-07  
学习了。Spring Security,权限相关,我也想使用,不用老是自己写。
0 请登录后投票
   发表时间:2010-05-09  
allen什么意思?我照着配出错了
0 请登录后投票
   发表时间:2010-05-11  
西门吹牛 写道
allen什么意思?我照着配出错了

allen是包名吧
0 请登录后投票
   发表时间:2010-05-11  
我用的还是security2.0.5 的版本,感觉用起来还可以。再配合ACL,用起来就更好了,等有时间再把ACL 用起来试试
0 请登录后投票
   发表时间:2010-05-12   最后修改:2010-05-12
最近在看这个东西,累啊。

验证那块已经熟悉了,为了练手,自己实现了UserDetails,自己写的UserDetailsService,自己实现的AuthenticationProvider。登陆页面也是自己弄的(我真的很讨厌j_username和j_password)这两个名字:(

下一步研究授权,正在跟踪过滤器调用链。
准备拿掉一些没用的东东,比如那个basic,想不出来什么地方会用到。还有那个匿名xxx的。还有想要支持验证码好像得自己写过滤器插进去了吧(隐约听说有个现成的东东,不过项目的头已经失踪好久了。。。。)
0 请登录后投票
   发表时间:2010-06-10  
不知道大家有没有注意过,如果自定义的一个类去实现 UserDetails ,自定义的类 又关联了另一个 实体类 (比如 group ),当从 SecurityContextHolder.getContext().getAuthentication().getPrincipal() 获得 用户信息时,通过 上下文返回的对象获取关联的group 对象有问题,一直没想明白。
0 请登录后投票
   发表时间:2010-06-13  
angjunwen 写道
不知道大家有没有注意过,如果自定义的一个类去实现 UserDetails ,自定义的类 又关联了另一个 实体类 (比如 group ),当从 SecurityContextHolder.getContext().getAuthentication().getPrincipal() 获得 用户信息时,通过 上下文返回的对象获取关联的group 对象有问题,一直没想明白。

你还别说,我就是这么弄得,你出啥问题了,我用的一点问题都没有!!!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics