前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringSecurity实现数据库认证

SpringSecurity实现数据库认证

作者头像
用户4919348
发布2019-12-11 16:02:23
6830
发布2019-12-11 16:02:23
举报
文章被收录于专栏:波波烤鸭波波烤鸭

  上篇文章我们介绍了SpringSecurity系统认证的流程,我们发现系统认证其实是通过一个UserDetailService的实现类来实现的,所以我们就可以使用相同的方式将认证的业务改成和数据库的对比。此案例持久层我们通过Mybatis来实现

一、mybatis准备

1.导入相关依赖

代码语言:javascript
复制
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.3</version>
</dependency>
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>2.0.3</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.43</version>
</dependency>
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.10</version>
</dependency>

2.配置文件

db.properties

代码语言:javascript
复制
#mysql\u6570\u636E\u5E93\u8FDE\u63A5
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/srm?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

Mybatis的配置文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    
</configuration>

和spring的整合文件

代码语言:javascript
复制
<!-- 配置数据库连接池 -->
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
      destroy-method="close">
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="driverClassName" value="${jdbc.driver}" />
    <property name="maxActive" value="10" />
    <property name="minIdle" value="5" />
</bean>
<!-- SqlSessionFactory -->
<!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 数据库连接池 -->
    <property name="dataSource" ref="dataSource" />
    <!-- 加载mybatis的全局配置文件 -->
    <property name="configLocation" value="classpath:mybatis-config.xml" />
    <!--
        映射文件和接口文件不在同一个目录下的时候
        它的spring是不会去扫描jar包中的相应目录的,只会去他当前项目下获取。其实要改变这种情况很简单,
        在classpath后面加一个*号,*号的作用是让spring的扫描涉及全个目录包括jar
    -->
    <property name="mapperLocations" value="classpath*:mapper/*.xml"/>
</bean>
<!-- Mapper映射文件的包扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.dpb.security.dao" />
</bean>

3.pojo文件

代码语言:javascript
复制
package com.dpb.security;

/**
 * @program: springboot-52-security
 * @description: 用户
 * @author: 波波烤鸭
 * @create: 2019-12-01 22:26
 */
public class UserPojo{
    private Integer  id;

    private String username;

    private String password;

    private String salt;

    private String nickname;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSalt() {
        return salt;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}

4.dao接口

定义一个根据账号查询的方法即可

在这里插入图片描述
在这里插入图片描述

5.映射文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dpb.security.dao.UserDao">
    <select id="queryByUserName"  resultType="com.dpb.security.pojo.UserPojo">
        select * from t_user where username = #{userName}
    </select>
</mapper>

6.service

接口定义

在这里插入图片描述
在这里插入图片描述

接口实现

在这里插入图片描述
在这里插入图片描述

二、service修改

接下来我们看看如何将SpringSecurity引入进来

1.UserService 继承 UserDetailService接口

在这里插入图片描述
在这里插入图片描述

2.重写loadUserByusername方法

代码语言:javascript
复制
    /**
     * 根据账号查询
     * @param s 登录表单输入的账号
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        // 根据账号去数据库中查询
        UserPojo userPojo = this.queryByUserName(s);
        if(userPojo != null){
            List<SimpleGrantedAuthority> authorities = new ArrayList<>();
            // 设置登录账号的角色
            authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
            UserDetails user = new User(userPojo.getUsername(),"{noop}"+userPojo.getPassword(),authorities);
            return user;
        }
        // 返回null 默认表示账号不存在
        return null;
    }
}

三、配置文件修改

  既然使用自定义的认证方法,那么原来设置的内存中的账号就不需要了

在这里插入图片描述
在这里插入图片描述

四、登录测试

启动系统,登录测试即可

在这里插入图片描述
在这里插入图片描述

搞定~

五、加密处理

  显然在实际项目中,对密码加密是必须的,所以我们就来看看SpringSecurity中是怎么做加密的。我们在此处通过BCryptPasswordEncoder来加密,动态加盐的方式

在这里插入图片描述
在这里插入图片描述

配置文件中设置加密规则

在这里插入图片描述
在这里插入图片描述

去掉{noop}

在这里插入图片描述
在这里插入图片描述

修改数据库中对应的密码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、认证状态判断

  我们在实际项目中因为用户的不同操作,可能会给出不同的状态,比如正常,冻结等,SpringSecurity也支持,我们来看下,如何实现。

在这里插入图片描述
在这里插入图片描述

然后我们在认证的时候使用User对象的另一个构造器就可以了

在这里插入图片描述
在这里插入图片描述

参数

说明

boolean enabled

是否可用

boolean accountNonExpired

账号是否失效

boolean credentialsNonExpired

秘钥是否失效

boolean accountNonLocked

账号是否锁定

如此设置即可

在这里插入图片描述
在这里插入图片描述

然后状态(status)为0的记录就没法正常登陆咯~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、mybatis准备
    • 1.导入相关依赖
      • 2.配置文件
        • 3.pojo文件
          • 4.dao接口
            • 5.映射文件
              • 6.service
              • 二、service修改
                • 1.UserService 继承 UserDetailService接口
                  • 2.重写loadUserByusername方法
                  • 三、配置文件修改
                  • 四、登录测试
                  • 五、加密处理
                  • 六、认证状态判断
                  相关产品与服务
                  访问管理
                  访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档