专栏首页信息安全小学生Spring security笔记2/4: 自定义用户信息

Spring security笔记2/4: 自定义用户信息

自定义用户信息

Spring Security 的用户信息通过 UserDetailsService 接口实现,只需要实现其中 loadUserByUsername(String username) 方法,就可以完成用户信息的自定义

实现步骤

1. 复制上一示例的源码

重命名包名 case1 为 case2

重命名 Case1Application.java 为 Case2Application.java

2. 自定义安全性配置

创建新的 config 包,并新建 WebSecurityConfig.java 类。

完整的代码如下:

package net.txt100.learn.springsecurity.base.case2.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * Title: WebSecurityConfig
 * Package: net.txt100.learn.springsecurity.base.case2.config
 * Creation date: 2019-08-11
 * Description:
 *
 * @author <a href="zgjt_tongl@thunis.com">Tonglei</a>
 * @since 1.0
 */
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder() {
        // 配置密码的保护策略,spring security 默认使用 bcrypt 加密算法。
        // 此处只要显式声明 BCryptPasswordEncoder Bean 即可
        return new BCryptPasswordEncoder();
    }
}

3. 实现 UserDetailsService

创建 service 包,创建 SimpleUserDetailsService 类实现 UserDetailsService 接口。

完整代码如下:

package net.txt100.learn.springsecurity.base.case2.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
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.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.Collections;

/**
 * Title: SimpleUserDetailsService
 * Package: net.txt100.learn.springsecurity.base.case2.service
 * Creation date: 2019-08-11
 * Description: 使用预定义用户信息
 *
 * @author <a href="zgjt_tongl@thunis.com">Tonglei</a>
 * @since 1.0
 */
@Service
public class SimpleUserDetailsService implements UserDetailsService {

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 根据用户名,返回用户的 用户名、密码、权限 信息
        // 本例中 任意用户名 + 密码 123456,均可登录成功
        // ROLE_* 是 spring security 风格的角色定义,此处 * 可以任意替换
        User user = new User(
                username,
                passwordEncoder.encode("123456"),
                Collections.singleton(new SimpleGrantedAuthority("ROLE_USER"))
        );
        return user;
    }
}

4. 编译及执行

打开命令行,进入工程根目录,执行编译命令

gradle compileJava

执行运行命令

gradle run

访问 http://localhost:8080/user/all

用户名填入任意字符串,比如 user1

密码必须填入: 123456

同样可以看到认证成功的页面。

输入其他密码,将提示密码错误

总结

通过自定义 UserDetailsService 类,可以实现用户的自定义。

注意: 最新版本的 spring boot 框架中,PasswordEncoder 必须显示定义,否则密码无法验证通过。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring security笔记4/4: 自定义成功和失败

    重命名 Case3Application.java 为 Case4Application.java

    tonglei0429
  • Spring security笔记3/4: 自定义登录页面

    重命名 Case2Application.java 为 Case3Application.java

    tonglei0429
  • Python Lambda 表达式

    tonglei0429
  • Spring Security技术栈开发企业级认证与授权(十二)将短信验证码验证方式集成到Spring Security

    在Spring Security中,我们最常用的登录验证机制是基于用户名和密码的,输入了用户名和密码以及图片验证码之后,就会进入一系列的过滤器链中,直到验证成功...

    itlemon
  • 【Kotlin Spring Boot 服务端开发: 问题集锦】 Spring Security : 自定义AccessDeniedHandler 处理 Ajax 请求

    【Kotlin Spring Boot 服务端开发: 问题集锦】 Spring Security : 自定义AccessDeniedHandler 处理 Aja...

    一个会写诗的程序员
  • Spring Security技术栈开发企业级认证与授权(八)Spring Security的基本运行原理与个性化登录实现

    其中绿色部分的每一种过滤器代表着一种认证方式,主要工作检查当前请求有没有关于用户信息,如果当前的没有,就会跳入到下一个绿色的过滤器中,请求成功会打标记。绿色...

    itlemon
  • Spring Boot + Security-01基于内存认证

    代码地址:https://github.com/zhangpu1211/Spring-Security-Demos

    听城
  • Spring Security与OAuth2

    Spring Security为基于j2ee的企业软件应用程序提供了全面的安全服务。它强大、灵活、可插。它不像代理服务器、防火墙、OS级别安全性、入侵检测系统或...

    程序你好
  • 在tornadofx中使用javafx并发框架示例

    1个枚举javafx.concurrent.Worker.State,代表Worker的不同状态READY,SCHEDULED,RUNNING,SUCCEEDE...

    用户6167008
  • Geant4--探测器从能量沉积谱到模拟真实能谱(1)

    核辐射探测器模拟是绝大多数Geant4使用者的主要任务,今天给大家带来一个题主自己写的例子。该例子实现了“模拟一个闪烁晶体对于某放射性同位素的伽玛能谱输出”。因...

    梁佐佐

扫码关注云+社区

领取腾讯云代金券