springsecurity oauth2.0 认证与授权查询数据库信息6

一 核心功能介绍

实际项目中用户信息存储在数据库中 ,只需要重新定义UserDetailService即可实现根据用户账号查询数据库。
也就是说:只需要实现userDeatailService接口,重写loadUserByUsername()方法,在方法中调用dao层进行查询数据库信息。
package com.ljf.spt.security.service;

import com.ljf.spt.security.dao.UserMapper;
import com.ljf.spt.security.model.UserDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @ClassName: SpringDataUserDetailsService
 * @Description: TODO
 * @Author: liujianfu
 * @Date: 2021/08/14 09:44:20 
 * @Version: V1.0
 **/
@Service
public class SpringDataUserDetailsService implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        //将来连接数据库根据账号查询用户信息
        UserDto userDto = userMapper.getUserByUsername(username);
        if(userDto == null){
            //如果用户查不到,返回null,由provider来抛出异常
            return null;


        }
        //权限
        String [] authoritys={"p1"};
        UserDetails userDetails = User.withUsername(userDto.getUsername()).password(userDto.getPassword()).authorities(authoritys).build();
        return userDetails;
    }
}

二 操作步骤

2.1  初始化脚本

1.新建数据库

 2.新建表

CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL COMMENT '用户id', `username` varchar(64) NOT NULL, `password` varchar(64) NOT NULL, `fullname` varchar(255) NOT NULL COMMENT '用户姓名', `mobile` varchar(11) DEFAULT NULL COMMENT '手机号', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC

3.新增数据

2.2  使用mybaits实现查询数据库

2.2.1 配置pom

  <!-- 连接数据库mysql -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>
    <!-- 分页插件 -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-starter</artifactId>
      <version>1.2.5</version>
    </dependency>
    <!-- alibaba的druid数据库连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.9</version>
    </dependency>

2.2.2 配置dao层

package com.ljf.spt.security.dao;

import com.ljf.spt.security.model.UserDto;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserMapper {
    //查找用户名
    public UserDto getUserByUsername(@Param("userName") String username);
    //查找该用户名下的权限
    public List<String> findPermissionsByUserId(@Param("userId") String userId);
}

2.2.3 mapper层

<?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.ljf.spt.security.dao.UserMapper" >
 <!-- 查询用户信息 -->
    <select id="getUserByUsername" resultType="com.ljf.spt.security.model.UserDto" >
		select id,username,password,fullname from t_user where username = #{userName}
	</select>
	<!-- 查询用户信息 -->

</mapper>

2.2.4 application配置文件

#基本配置
server.port=8080
server.servlet.context-path=/spt-security
spring.application.name =springboot-security
#视图
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
#mysql
spring.datasource.name=mysql_test
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#druid相关配置
#监控统计拦截的filters
spring.datasource.druid.filters=stat
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
#基本属性
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/security_db?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
spring.datasource.druid.username=root
spring.datasource.druid.password=root
#配置初始化大小/最小/最大
spring.datasource.druid.initial-size=1
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=20
#获取连接等待超时时间
spring.datasource.druid.max-wait=60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
spring.datasource.druid.time-between-eviction-runs-millis=60000
#一个连接在池中最小生存的时间
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 'x'
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
spring.datasource.druid.pool-prepared-statements=false
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
#mybaits
mybatis.mapper-locations: classpath:mapper/*.xml
mybatis.type-aliases-package: com.ljf.spt.security.model
#pagehelper
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
pagehelper.returnPageInfo=check

2.2.5 service配置

package com.ljf.spt.security.service;

import com.ljf.spt.security.dao.UserMapper;
import com.ljf.spt.security.model.UserDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @ClassName: SpringDataUserDetailsService
 * @Description: TODO
 * @Author: liujianfu
 * @Date: 2021/08/14 09:44:20 
 * @Version: V1.0
 **/
@Service
public class SpringDataUserDetailsService implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        //将来连接数据库根据账号查询用户信息
        UserDto userDto = userMapper.getUserByUsername(username);
        if(userDto == null){
            //如果用户查不到,返回null,由provider来抛出异常
            return null;


        }
        //权限
        String [] authoritys={"p1"};
        UserDetails userDetails = User.withUsername(userDto.getUsername()).password(userDto.getPassword()).authorities(authoritys).build();
        return userDetails;
    }
}

2.2.6 启动类加注解

package com.ljf.spt.security;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Hello world!
 *
 */
@SpringBootApplication
@MapperScan("com.ljf.spt.security.dao") //@MapperScan 用户扫描MyBatis的Mapper
public class App 
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class,args);
        System.out.println("启动完成!!!");
    }
}

2.2.7 security配置类设置加密注解

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
同时注释掉:

 2.2.8 启动访问

http://localhost:8080/spt-security/login-view

 成功后:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security OAuth2.0 是基于 Spring Security 框架实现的用于认证授权的开源库。它提供了一种标准的方式来保护和控制你的应用程序中的资源,同时也支持第三方应用程序通过 OAuth2.0 协议与你的应用程序进行交互。 OAuth2.0 是一个开放标准的授权协议,它允许用户授权第三方应用程序访问他们在另一个服务(资源服务器)上存储的受保护资源,而无需将用户名和密码提供给第三方应用程序。OAuth2.0 协议定义了四种角色:资源所有者(用户),客户端(第三方应用程序),授权服务器(负责验证用户身份并颁发访问令牌),以及资源服务器(存储受保护资源)。下面是 Spring Security OAuth2.0 的工作原理: 1. 客户端向授权服务器发送认证请求,包括客户端标识和重定向 URI。 2. 授权服务器验证客户端标识,并要求用户进行身份验证。 3. 用户提供凭据进行身份验证后,授权服务器生成授权码(authorization code)。 4. 授权服务器将授权码发送回客户端提供的重定向 URI。 5. 客户端收到授权码后,使用该授权码向授权服务器发送令牌请求。 6. 授权服务器验证客户端和授权码,并生成访问令牌(access token)和可选的刷新令牌(refresh token)。 7. 授权服务器将访问令牌和刷新令牌发送回客户端。 8. 客户端使用访问令牌向资源服务器请求受保护资源。 9. 资源服务器验证访问令牌,并向客户端返回受保护资源。 Spring Security OAuth2.0 提供了一些核心的组件来支持 OAuth2.0 协议,例如: - AuthorizationServer:负责颁发令牌和管理客户端的认证服务器。 - ResourceServer:保护受 OAuth2.0 保护的资源的资源服务器。 - TokenStore:用于存储访问令牌和刷新令牌的接口,可以使用内存、数据库或 Redis 等作为存储方式。 - UserDetailsService:用于加载用户信息的接口,可以从数据库或其他数据源中获取用户信息。 通过配置这些组件,你可以在 Spring Security 中实现 OAuth2.0 认证授权的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值