zoukankan      html  css  js  c++  java
  • Spring Security使用数据库数据完成认证练气后期2

    写在前面

    没错,这篇文章还是练气后期!但作者我相信筑基指日可待!
    在前一篇文章当中,我们简单地分析了一下Spring Security的认证流程,知道了如果想要实现对自己用户数据(账户、角色、权限)的读取,需要实现UserDetailsService这个接口以及实现对应的loadUserByUsername 的方法,编写自己的业务逻辑。并在spring security的配置文件当中指定认证使用的业务对象 。

    步骤

    第一步:编写自己的User实体类

    /**
     * @author 赖柄沣 bingfengdev@aliyun.com
     * @version 1.0
     * @date 2020/8/27 15:19
     */
    @TableName("sys_user")
    public class MyUserDO {
        @TableId
        private int id;
        private String username;
        private String password;
        private boolean status;
    
        getter。。。
        setter。。。
    }
    

    第二步:编写UserDetailsServiceImpl实现UserDetailsService接口

    /**
     * @author 赖柄沣 bingfengdev@aliyun.com
     * @version 1.0
     * @date 2020/8/23 9:48
     */
    public class UserServiceImpl implements UserDetailsService {
     	@Autowired
        private UserDao2Impl userDaoImpl;
    
    }
    

    第三步:实现loadUserByUsername方法

    /**使用spring security已经实现的user对象进行认证
         * @author 赖柄沣 bingfengdev@aliyun.com
         * @date 2020-08-27 15:24:28
         * @param username
         * @return org.springframework.security.core.userdetails.UserDetails
         * @throws UsernameNotFoundException
         * @version 1.0
         */
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    
            // 检验参数
            if (username == null||username.trim().length() == 0) {
                return null;
            }
    
            //构造条件(我使用的是MybatisPlus)
            QueryWrapper<MyUserDO> qw = Wrappers.query();
            qw.eq("username",username);
    
            //从数据库中查出自己的user对象
            MyUserDO myuser = userDaoImpl.selectOne(qw);
    
            //模拟获取用户具备的角色信息
            List<SimpleGrantedAuthority> simpleGrantedAuthorityList = new  ArrayList<>();
    
            simpleGrantedAuthorityList.add(new SimpleGrantedAuthority("ROLE_USER"));
            //封装成spring security的user对象
            //注意:这里的密码如果不是加密村存储的要加上"{noop}"
            User user = new User(myuser.getUsername(),myuser.getPassword(),simpleGrantedAuthorityList);
            return user;
        }
    

    第四步:在spring security的配置文件中指定认证信息数据源为自己的UserServiceImpl

    <security:authentication-provider user-service-ref="userService2Impl">
            </security:authentication-provider>
    

    至此,spring security使用数据数据完成认证操作的编写流程便结束了,关于其中的原理,可以查看我的上一篇文章。

    如果觉得使用spring security提供的user对象不够方便,可以让自己编写的User对象继承spring security的User(之所以不推荐直接实现UserDetails接口是因为,如果直接实现该接口的话得自己编写用户账户状态的判断逻辑,那样将使得工作变得更加麻烦)

    补充:加密认证方式

    在IOC容器中提供加密对象

    <bean id="passwordEncoder"
    class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
    
    

    然后在存入用户数据前先对用户提交的密码进行加密。

    结束

    关于使用注解配置的方式较为简单,在本文当中并未给出,后续有时间写一写springboot整合spring security的文章。目前是学习spring security入门一小步,所以我们的关注点应该放在spring security本身,所以刚开始的时候会涉及到很多“原始性”的操作。

    代码下载:<https://github.com/code81192/art-demo/tree/master/spring-security-demo2

  • 相关阅读:
    真正的e时代
    在线手册
    UVA 10616 Divisible Group Sums
    UVA 10721 Bar Codes
    UVA 10205 Stack 'em Up
    UVA 10247 Complete Tree Labeling
    UVA 10081 Tight Words
    UVA 11125 Arrange Some Marbles
    UVA 10128 Queue
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/bingfengdev/p/13572181.html
Copyright © 2011-2022 走看看