使用Spring Security实现的简单认证授权方案
可直接使用spring security实现认证和授权。不过,因为实际项目的复杂性,一般都还需要进一步的定制。这里给出一个简单的定制解决数据库认证和基于配置文件的简单授权。
从Acegi Security传承下来的Spring Security虽然内容比较复杂,但是如果简单实现的话,只需实现以下三个绿色标示的接口,黄色部分是自行实现的类。
Authentication类是实体类,包含认证相关信息。和Role(角色)类是多对多关系。Role(角色)包含一个表示角色的字符串,比如ROLE_USER,Authentication与Role是多对多关系。通过Role可以生成GrantedAuthority。
public class Authentication implements UserDetails { ... @Override public GrantedAuthority[] getAuthorities() { List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>( roles.size()); for (Role role : roles) { grantedAuthorities.add(new GrantedAuthorityImpl(role.getName())); } return grantedAuthorities.toArray(new GrantedAuthority[roles.size()]); } ...
Role代码就是一个有id和name属性的javabean。
UserDetailsService是需要配置给Spring Security使用的主要服务类,Spring Security已经实现了通过内存、JDBC和LDAP等数据源的类。这里自定义自己的Dao接口,可以使用比如Hibernate实现。
@Service("myUserDetailsService") public class MyUserDetailsService implements UserDetailsService { @Resource(name="authenticationDao") private AuthenticationDao authenticationDao; @Override @Transactional(propagation = Propagation.SUPPORTS) public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { return this.authenticationDao.findByUsername(username); }
在spring配置文件中的设置:
<http auto-config='true'> <intercept-url pattern="/**" access="ROLE_USER" /> </http> <authentication-provider user-service-ref="myUserDetailsService" />
通过dbunit在数据库相关表中预置的数据:
<table name="authentication"> <column>id</column> <column>username</column> <column>password</column> <column>accountNonExpired</column> <column>accountNonLocked</column> <column>enabled</column> <column>credentialsNonExpired</column> <row> <value>1</value> <value>marshal</value> <value>password</value> <value>true</value> <value>true</value> <value>true</value> <value>true</value> </row> </table> <table name="role"> <column>id</column> <column>name</column> <row> <value>1</value> <value>ROLE_USER</value> </row> <row> <value>2</value> <value>ROLE_ADMIN</value> </row> </table> <table name="auth_roles"> <column>auth_id</column> <column>role_id</column> <row> <value>1</value> <value>1</value> </row> <row> <value>1</value> <value>2</value> </row> </table>
这篇文章上的评论的 RSS feed TrackBack URI