• 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

  • 相关阅读:
    64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多
    selenium3 + python3
    selenium3 + python
    selenium3 + python
    selenium3+python-多窗口、句柄(handle)
    selenium3 + python
    selenium3 + python
    selenium3 + python 操作浏览器基本方法
    Appium
    Appium
  • 原文地址:https://www.cnblogs.com/linhp/p/5817016.html
Copyright © 2020-2023  润新知