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

  • 相关阅读:
    JavaScript实现Map、Reduce和Filter
    Javascript常用对象的属性和方法
    自己封装的Ajax
    JavaScript函数调用规则
    JavaScript模板引擎使用
    java 简单贪吃蛇
    java邮件发送(含附件)
    java 读写Oracle Blob字段
    java 连接飞信API
    非常棒的Java REST服务器栈
  • 原文地址:https://www.cnblogs.com/bingfengdev/p/13572181.html
Copyright © 2011-2022 走看看