Spring Web Security3.0 初体验

看了看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还是很和谐的。扩展很容易。用着挺舒服。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值