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接口。下面是图解。

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

posted @ 2016-08-29 10:32  hp柠檬茶  阅读(2444)  评论(1编辑  收藏  举报