Spring-Security (学习记录三)--读取数据库中的用户和角色

用数据库中的用户跟角色替换spring-security.xml中的用户名和角色,这里我用hibernate框架来获取数据库中的用户名和角色

详情请看附件

1.先将hibernate的环境整合进来

2.创建一个数据库security,执行security.sql

3.修改spring-security.xml,采用数据库的方式读取用户跟角色

<!-- 认证管理器,配置了管理员与角色的关系  -->
<security:authentication-manager>
<!-- 配置账号密码所属的角色 角色以 ROLE_开头,为spring获取名称的标识 -->
<security:authentication-provider user-service-ref="accountService">
<!-- 采用xml的方式
<security:user-service>
<security:user name="user" password="user" authorities="ROLE_USER" />
<security:user name="admin" password="admin" authorities="ROLE_ADMIN" />
</security:user-service>
-->
</security:authentication-provider>
</security:authentication-manager>
  • 配置文件中的accountService需要实现UserDetailsService接口,实现loadUserByUsername方法,

    security框架会根据这个方法来获取用户信息
    @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return accountDao.getJoinRole(username);
}

由于这个方法返回的是UserDetails类型,所以我们的用户类Account需要实现UserDetails接口,

在Account中。由于实现UserDetails接口,需要返回角色信息的类型为Collection<? extends GrantedAuthority>,所以我们的Role类还需要实现GrantedAuthority接口

    /**
* 返回角色集合
*/
@Transient
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return roles;
}

详情请看下面百度云连接

注:如果项目启动报错,刷新maven

4.uml图说明其中的关系

spring采用了接口的方式,来规定流程,我们需要实现相应的接口来把这个流程跑起来。
    认证管理器 <security:authentication-manager>中要求我们实现UserDetailsService接口,而接口中的方法 public UserDetails loadUserByUsername(String username) 规定了我们要返回UserDetails 类型,所以我们的account需要实现UserDetails接口,接下来UserDetails接口中需要实现public Collection<? extends GrantedAuthority> getAuthorities()方法,规定了我们返回的角色role类需要实现GrantedAuthority接口。下面是图解。

Spring-Security (学习记录三)--读取数据库中的用户和角色

百度云链接:http://pan.baidu.com/s/1geD4635 密码:wo2i

上一篇:Spring配置中的"classpath:"与"classpath*:"的区别研究


下一篇:Oracle数据库之创建表结构