前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring security笔记2/4: 自定义用户信息

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

作者头像
tonglei0429
发布2019-09-09 16:23:50
7030
发布2019-09-09 16:23:50
举报

自定义用户信息

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 必须显示定义,否则密码无法验证通过。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自定义用户信息
    • 实现步骤
      • 1. 复制上一示例的源码
      • 2. 自定义安全性配置
      • 3. 实现 UserDetailsService
      • 4. 编译及执行
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档