首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Spring-security的SecurityContext中存储自定义信息?

在Spring Security的SecurityContext中存储自定义信息可以通过以下步骤实现:

  1. 创建一个自定义的实体类,用于存储需要存储的自定义信息。
  2. 实现一个实现了Authentication接口的自定义Authentication类,该类用于封装自定义信息,并且可以在认证成功后将该类对象存储到SecurityContext中。
  3. 创建一个实现了AuthenticationProvider接口的自定义AuthenticationProvider类,该类用于对用户进行认证,并且在认证成功后返回一个包含自定义信息的Authentication对象。
  4. 在Spring Security的配置类中,配置自定义的AuthenticationProvider类,并且在配置中指定将自定义信息存储到SecurityContext中。

下面是一个示例代码:

  1. 创建一个自定义的实体类 CustomUser:
代码语言:java
复制
public class CustomUser {
    private String username;
    private String email;
    
    // 省略getter和setter方法
}
  1. 创建一个实现了Authentication接口的自定义Authentication类 CustomAuthentication:
代码语言:java
复制
public class CustomAuthentication implements Authentication {
    private CustomUser customUser;
    private boolean authenticated;
    
    // 构造方法和其他方法省略
    
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }
    
    @Override
    public Object getCredentials() {
        return null;
    }
    
    @Override
    public Object getDetails() {
        return null;
    }
    
    @Override
    public Object getPrincipal() {
        return null;
    }
    
    @Override
    public boolean isAuthenticated() {
        return authenticated;
    }
    
    @Override
    public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
        this.authenticated = isAuthenticated;
    }
    
    @Override
    public String getName() {
        return customUser.getUsername();
    }
}
  1. 创建一个实现了AuthenticationProvider接口的自定义AuthenticationProvider类 CustomAuthenticationProvider:
代码语言:java
复制
public class CustomAuthenticationProvider implements AuthenticationProvider {
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        // 获取用户输入的用户名和密码
        String username = authentication.getName();
        String password = authentication.getCredentials().toString();
        
        // 根据用户名和密码进行认证,这里省略具体的认证逻辑
        
        // 认证成功后,创建一个包含自定义信息的CustomUser对象
        CustomUser customUser = new CustomUser();
        customUser.setUsername(username);
        customUser.setEmail("example@example.com");
        
        // 创建一个CustomAuthentication对象,并设置为已认证
        CustomAuthentication customAuthentication = new CustomAuthentication();
        customAuthentication.setAuthenticated(true);
        customAuthentication.setCustomUser(customUser);
        
        return customAuthentication;
    }
    
    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}
  1. 在Spring Security的配置类中配置自定义的AuthenticationProvider类,并且指定将自定义信息存储到SecurityContext中:
代码语言:java
复制
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private CustomAuthenticationProvider customAuthenticationProvider;
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(customAuthenticationProvider);
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 配置其他的安全规则
    }
    
    @Bean
    public SecurityContextRepository securityContextRepository() {
        HttpSessionSecurityContextRepository repository = new HttpSessionSecurityContextRepository();
        repository.setAllowSessionCreation(false);
        return repository;
    }
    
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.securityContextRepository(securityContextRepository());
    }
}

通过以上步骤,就可以在Spring Security的SecurityContext中存储自定义信息了。在认证成功后,可以通过以下代码获取自定义信息:

代码语言:java
复制
CustomAuthentication authentication = (CustomAuthentication) SecurityContextHolder.getContext().getAuthentication();
CustomUser customUser = authentication.getCustomUser();
String username = customUser.getUsername();
String email = customUser.getEmail();

这样就可以获取到存储在SecurityContext中的自定义信息了。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Security 实战干货:SecurityContext相关知识

今天我们来讲一下如何在接口访问检索当前认证用户信息。我们先讲一下具体场景。通常我们在认证后访问需要认证资源时需要获取当前认证用户信息。比如 “查询我个人信息”。...当服务端对 JWT Token 认证通过后,会将认证用户信息封装到 UsernamePasswordAuthenticationToken 并使用工具类放入安全上下文 SecurityContext...3.1 扩展知识:SecurityContextHolder 存储策略 这里也扩展一下知识面,简单讲一下 SecurityContextHolder 是如何存储 SecurityContext 。...SecurityContextHolder 默认有三种存储 SecurityContext 策略: MODE_THREADLOCAL 利用ThreadLocal 机制来保存每个使用者 SecurityContext...总结 SecurityContext 是 Spring Security 一个非常重要类,今天不但介绍 SecurityContext 是什么、有什么作用,也对以前讲过一些知识进行回顾。

1.5K30

何在keras添加自己优化器(adam等)

2、找到keras在tensorflow下根目录 需要特别注意是找到keras在tensorflow下根目录而不是找到keras根目录。...一般来说,完成tensorflow以及keras配置后即可在tensorflow目录下python目录中找到keras目录,以GPU为例keras在tensorflow下根目录为C:\ProgramData...找到optimizers.pyadam等优化器类并在后面添加自己优化器类 以本文来说,我在第718行添加如下代码 @tf_export('keras.optimizers.adamsss') class...# 传入优化器名称: 默认参数将被采用 model.compile(loss=’mean_squared_error’, optimizer=’sgd’) 以上这篇如何在keras添加自己优化器...(adam等)就是小编分享给大家全部内容了,希望能给大家一个参考。

44.9K30

何在字典存储路径

在Python,你可以使用嵌套字典(或其他可嵌套数据结构,嵌套列表)来存储路径。例如,如果你想要存储像这样路径和值:1、问题背景在 Python ,我们可以轻松地使用字典来存储数据。...字典是一种无序键值对集合,键可以是任意字符串,值可以是任意类型数据。我们还可以使用字典来存储其他字典,这样就形成了一个嵌套字典。有时候,我们需要存储一个字典中值路径。...但是,如果我们需要存储 city 值路径呢?我们不能直接使用一个变量 city_field 来存储这个路径,因为 city 值是一个嵌套字典值。...2、解决方案有几种方法可以存储字典中值路径。第一种方法是使用循环。我们可以使用一个循环来遍历路径每个键,然后使用这些键来获取值。...第三种方法是使用自定义字典类。我们可以创建一个自己字典类,并在其中定义一个新方法来获取值路径。

7010

Spring Security 6.x 图解身份认证架构设计

,其底层使用了ThreadLocal实现对SecurityContext对象存取逻辑,这样可以保证在一次请求同一个线程,方便地获取SecurityContext对象。...SecurityContext实例,如上文所述,通常会保存在ThreadLocal AuthorizationFilter:如果该请求没有被认证过,那么在当前SecurityContext对象是没有...this.securityContextHolderStrategy.setContext(context); // 存储SecurityContextHolder,方便同一个线程执行过程其他地方获取...实现维护在List列表,通过遍历使得不同认证协议进入不同认证实现类,然后都返回Authentication对象,Authentication定义了一个认证信息应该必须包含信息,包括用户标识principal...,凭证credentials,权限authorities,因此我们也可以实现自定义AuthenticationProvider,并注册到ProviderManager,然后再实现自定义认证Filter

17200

何在Python实现安全密码存储与验证

在现代互联网时代,安全性已经成为一个非常重要问题。在我们日常生活,我们会使用许多网站和应用程序,而这些网站和应用程序通常要求我们提供密码来保护我们个人信息。...然而,密码泄露事件时有发生,我们经常听到关于黑客攻击和数据泄露新闻。那么,如何在Python实现安全密码存储与验证呢?本文将向你介绍一些实际操作和技术。...相反,我们应该使用哈希算法对密码进行加密,将加密后密码存储在数据库。...此外,为了进一步增强密码安全性,我们还可以结合其他技术,多重认证、密码策略等来提高整体安全性。 希望本文可以帮助你了解如何在Python实现安全密码存储与验证。...通过采取合适密码存储与验证方法,我们可以保护用户个人信息,提高系统安全性。当然,安全是一个持续不断工作,我们应该时刻关注最新安全技术和防护措施,为用户提供更加安全可靠服务。

97720

spring websocket 调用受权限保护方法失败

版本 spring-security 5.6.10 spring-websocket 5.3.27 现象 通过AbstractWebSocketHandler实现websocket端点处理器 调用使用...@PreAuthorize注解方法报错,无法在SecurityContext中找到认证信息 org.springframework.security.authentication.AuthenticationCredentialsNotFoundException...An Authentication object was not found in the SecurityContext 原因 调用websockethandler线程非用户会话线程,所以安全上下文中没有认证信息...解决 在处理消息时将WebsocketSession中保存认证信息设置到SecurityContext import org.springframework.web.socket.handler.AbstractWebSocketHandler...handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { // 调用受保护方法

24520

何在 Eclipse 更改注释块 @author 版权信息

文章目录 前言 一、打开需要进行版权标注类 二、进入配置页面 三、编辑配置信息 四、测试 总结 ---- 前言 我们在使用 IDE——Ecilpse 进行开发,需要注明版权信息时候,如果不更改默认设置的话...---- 一、打开需要进行版权标注类 打开 Ecilpse 需要备注一个类或者是方法开发者信息,默认是系统用户,如下我就是 Lenovo,如下图所示: ?...三、编辑配置信息 选种"Tpyes",点击"Edit…"进入编辑页面,如下图所示: ? 说明:${user}属性默认取值是我们本地管理员 user 信息。 例如联想电脑默认取 lenovo。...我们将${user}属性更改为我们需要标注作者信息即可。 ? 四、测试 我们再次点击一个类进行注释,即可看到@auther信息已经更换为我们设置成取值,如下图所示: ?...---- 总结 本文我们掌握了如何在 Eclipse 修改注释版权信息,这样我们就无需每次手动去调整了。那么同学,你是否会在 IDEA 里面修改注释版权信息呢?

4.1K51

SpringSecurity6 | 核心过滤器

3.3HeaderWriterFilter HeaderWriterFilter字面理解为请求头写入过滤器,他作用是将某些头信息添加到响应,添加某些启用浏览器保护信息非常有用,X-Frame-Options...在请求到达后端应用程序时,SecurityContextHolderFilter 将当前安全上下文信息从 HTTP 请求获取,并存储在 SecurityContextHolder 。...存储中加载 SecurityContext Supplier deferredContext = this.securityContextRepository.loadDeferredContext...安全上下文是指存储了当前用户认证信息身份、权限等)对象,在整个请求处理过程需要被使用。...请求信息恢复:当用户完成身份验证后,RequestCacheAwareFilter 会根据请求缓存信息,将用户原始请求信息请求 URL、请求参数等)恢复,从而让用户能够继续之前被中断请求处理流程

53331

详解SpringSecurity认证

SpringSecurity – 安全认证 AuthenticationManager) 在spring-security官网认证是由AuthenticationManager接口来进行负责,定义为...实际上 SecurityContextHolder 存储SecurityContext,在 SecurityContext 存储是 Authentication。...MODE THREADLOCAL:这种存放策略是将 SecurityContext 存放在 ThreadLocal,大家知道 Threadlocal 特点是在哪个线程存储就要在哪个线程读取,这其实非常适合...这也是 SecurityContextHolder 默认存储策略,这种存储策略意味着如果在具体业务处理代码,开启了子线程,在子线程中去获取登录用户数据,就会获取不到。...有时,一个应用程序有受保护资源逻辑组(例如,所有符合路径模式网络资源,/api/**),每个组可以有自己专用 AuthenticationManager。

15110

Spring Security入门(三): 基于自定义数据库查询认证实战

0 引言 在笔者上一篇文章Spring Security入门(二):基于内存认证一文中有提到过Spring Security实现自定义数据库查询需要你实现UserDetailsService接口...我们可以在UserDetailsService接口实现类中注入数据库访问对象Dao,从而实现自定义数据库查询认证用户信息。...,数据库里用户登录密码或支付密码等安全性要求较高字段一律采用加密存储方式存储。...json格式美化,看起来非常清晰 5 存储用户认证信息源码解读 5.1 认识SecurityContextHolder和SecurityContext 用户登录成功后认证信息最终能会作为一个Authentication...,这也就意味着即时当前SecurityContext对象没有作为一个参数传递到具体方法里去,同一个线程任意方法都能拿到SecurityContext对象,进而拿到用户认证信息

1.4K40

SpringSecurity6 | 回顾Filter

登录页面是怎么产生? 登录页面可以自定义吗? 后面几篇文章,我们会带着这些问题去研究SpringSecurity,并找出问题答案。...身份验证是SpringSecurity一个重要功能,它能够验证请求发起者是否具有访问受保护资源权限,通常是通过用户名和密码来验证身份。...5.过滤器分类 SecurityContextPersistenceFilter: 该过滤器用来确保在整个请求过程**SecurityContext(安全上下文)**得以保留和传递。...SecurityContext主要是用来存储当前用户身份信息、角色、权限等。 LogoutFilter: 该过滤器用来处理用户注销请求,通常会清除当前用户身份信息。...6.参考文献 https://docs.spring.io/spring-security/reference/servlet/architecture.html 7.总结 以上便是本文全部内容,本人才疏学浅

23310

浅析 Spring Security 认证过程及相关过滤器

核心过滤器链简介 Spring Security 过滤器有很多,一般正常项目中都有十几个过滤器,有时候还包含自定义过滤器,当然我们不可能对每一个过滤器都进行分析,我们需要抓住重点,找比较关键几个过滤器...,检查Session是否存在SecurityContext,如果不存在,就创建一个新SecurityContext。...SecurityContextHolder.clearContext(); //将安全上下文信息存储到 Session,相当于登录态维护 repo.saveContext(contextAfterChainExecution...请求结束时,同样利用HttpSessionSecurityContextRepository该存储安全上下文仓库将认证后SecurityContext放入 Session,这也是登录态维护关键,...,之前请求最终会来到这里,它大致工作流程就是 封装请求信息 从系统读取配置信息,即资源所需权限信息 从 SecurityContextHolder获取之前认证过 Authentication

62410
领券