zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/linhp/p/5817016.html
Copyright © 2011-2022 走看看