SpringSecurity实现数据库认证-阿里云开发者社区

开发者社区> 游客a74jvhcp7vclg> 正文

SpringSecurity实现数据库认证

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

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


一、mybatis准备


1.导入相关依赖

<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

#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的配置文件

<?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的整合文件

<!-- 配置数据库连接池 -->
<!-- 加载配置文件 -->
<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文件

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接口


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


20191205162051511.png

5.映射文件

<?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


接口定义

2019120516212963.png

接口实现

20191205162139422.png


二、service修改


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


1.UserService 继承 UserDetailService接口

20191205162155439.png



2.重写loadUserByusername方法

    /**
     * 根据账号查询
     * @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;
    }
}

 

三、配置文件修改


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

20191205162302932.png


四、登录测试


启动系统,登录测试即可

20191205162319843.png

搞定~


五、加密处理


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

2019120516234243.png


配置文件中设置加密规则

20191205162348159.png

去掉{noop}

20191205162354928.png

修改数据库中对应的密码


20191205162410368.png

20191205162412289.png


六、认证状态判断


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

20191205162507286.png

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

20191205162521238.png

参数说明
boolean enabled是否可用
boolean accountNonExpired账号是否失效
boolean credentialsNonExpired秘钥是否失效
boolean accountNonLocked账号是否锁定


如此设置即可


20191205162634485.png


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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10077 0
Spring PropertyPlaceholderConfigurer数据库配置
pom.xml中添加依赖 mysql mysql-connector-java 5.1.38 com.alibaba druid 1.0.20 属性配置文件:system-config.
773 0
Shiro之身份认证、与spring集成(入门级)
目录 1. Shro的概念 2. Shiro的简单身份认证实现 3. Shiro与spring对身份认证的实现   前言:   Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。
1444 0
Spring Security笔记:HTTP Basic 认证
在第一节 Spring Security笔记:Hello World 的基础上,只要把Spring-Security.xml里改一个位置 1 2 3 4 注意第三行,加上后,再次访问/admin,会弹出下面的对话框: 有...
1331 0
Spring+Ibatis数据库水平分库
1.引言    笔者最近在做一个互联网的“类SNS”应用,应用中用户数量巨大(约4000万)左右,因此,简单的使用传统单一数据库存储肯定是不行的。
621 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13884 0
SpringBoot实战(四)之使用JDBC和Spring访问数据库
这里演示的是h2databse示例,所以简单的介绍普及下h2database相关知识 H2数据库是一个开源的关系型数据库。 H2是一个嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容。
2229 0
在Spring Boot中实现通用Auth认证的几种方式
在Spring Boot中实现通用Auth认证的几种方式
21 0
第6章 Spring Boot数据库集成
第6章 Spring Boot数据库层集成 6.1 Spring Boot集成mybatis 6.2 Spring Boot集成jpa 6.3 Spring Boot集成mongodb开发 参考资料: 1.
809 0
Spring Security 自定义认证
Spring Security 自定义认证
157 0
+关注
游客a74jvhcp7vclg
10余年开发架构经验,同时乐于技术分享!
332
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载