2.自定义认证实现流程

简介: 通过实现UserDetailsService接口并自定义用户加载逻辑,结合Spring Security配置,完成基于数据库的用户认证。注册自定义服务类至SecurityConfig,实现登录验证与权限加载,支持灵活扩展ORM框架,提升系统安全性与可维护性。(238字)

.实现UserDetailService与自定义逻辑
自定义用户类需要实现UserDetails接口,并实现接口的方法,所以我们编写下述代码。
package com.yzxb.SpringSecurity.service;

import com.yzxb.SpringSecurity.pojo.Role;
import com.yzxb.SpringSecurity.pojo.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.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
public class MyUserService implements UserDetailsService {

@Override
public UserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException {

    // 1-本地mysql用户存在性查询
    User user = selectUserFromDb();
    if (Objects.isNull(user)) {
        throw new UsernameNotFoundException("用户不存在");
    }

    // 2-本地查询权限
    List<Role> roles = selectAuthFromDb();

    // 3-设置权限信息
    user.setRoles(roles);

    // 4-返回权限合集
    return user;
}

/**
 * TODO 如果需要调用数据库查询,这里接入orm持久层框架即可
 * @return 用户本地权限合集
 */
private List<Role> selectAuthFromDb() {
    return new ArrayList<>();
}

/**
 * TODO 如果需要调用数据库查询,这里接入orm持久层框架即可
 * @return  本地用户信息
 */
private User selectUserFromDb() {
    return new User();
}

}
2.注册自定义实现类
package com.yzxb.SpringSecurity.config;

import com.yzxb.SpringSecurity.service.MyUserService;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import javax.annotation.Resource;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Resource
private MyUserService myUserService;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .anyRequest().authenticated()
            .and().formLogin().loginPage("/login.html")
            .loginProcessingUrl("/doLogin")
            .defaultSuccessUrl("/demo/index ")
            .failureUrl("/login.html")
            .usernameParameter("uname")
            .passwordParameter("passwd")
            .permitAll()
            .and()
            .csrf()
            .disable();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(myUserService);
}

}
改完的效果如下图

然后重启项目,就可以实现自定义的数据库认证逻辑。

相关文章
|
9天前
|
安全 Java Spring
2.过滤器链加载原理
通过分析DelegatingFilterProxy、FilterChainProxy与SecurityFilterChain源码,揭示了Spring Security过滤器链的加载机制:由web.xml中配置的DelegatingFilterProxy通过bean名称获取FilterChainProxy,再由其封装多个SecurityFilterChain,最终将十五个过滤器逐一加载执行,实现安全控制。
|
JavaScript
JS 获取对象数据类型的键值对的键与值
JS 获取对象数据类型的键值对的键与值
429 0
|
网络协议 Linux 网络安全
Linux测试端口的连通性的四种方法
Linux测试端口的连通性的四种方法
1286 0
|
NoSQL 数据可视化 MongoDB
mongoDB入门教程二:推荐一款好用的mongoDB可视化工具Robo 3T
mongoDB入门教程二:推荐一款好用的mongoDB可视化工具Robo 3T
755 1
mongoDB入门教程二:推荐一款好用的mongoDB可视化工具Robo 3T
springboot字段注入@value细节
springboot字段注入@value细节
225 1
|
前端开发 Java Spring
【Spring】“请求“ 之后端传参重命名,传递数组、集合,@PathVariable,@RequestPart
【Spring】“请求“ 之后端传参重命名,传递数组、集合,@PathVariable,@RequestPart
388 2
|
Web App开发 Linux Windows
解决Markdown文件上传至CSDN无法显示本地图片问题-白嫖版,分享给别人的md文件图片不显示的解决方案
解决Markdown文件上传至CSDN无法显示本地图片问题-白嫖版,分享给别人的md文件图片不显示的解决方案
747 3
|
SpringCloudAlibaba Java API
SpringCloud Alibaba微服务工程搭建(保姆级)
SpringCloud Alibaba微服务工程搭建(保姆级)
|
安全 NoSQL Java
Spring Security认证与授权框架
Spring Security认证与授权框架
441 1
|
JSON 安全 fastjson
fastjson2使用Feature.WriteBooleanAsNumber踩坑
fastjson2使用Feature.WriteBooleanAsNumber踩坑
431 0