首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从过滤器(Spring)访问UserDetails

规格说明

一个过滤器,它可以通过loadUserFromUsername()调用userDetailsService,以便从自定义UserDetails实例中检索租户DB详细信息。

问题

不管过滤器优先级设置为什么,这个自定义过滤器在安全过滤器之前运行,因此spring安全上下文是未填充或空的。当我从控制器访问主体对象时,我已经确认了这个上下文是填充的。

尝试

我已经将application.properties中的spring安全顺序设置为5,在注册此筛选器时,我使用了越来越小的值,但它一直运行在前面。我知道泛型过滤器bean应该允许我在安全配置中设置它,但是我不知道如何将配置和过滤器移动到一个通用过滤器bean中。

TenantFilter.java

代码语言:javascript
运行
AI代码解释
复制
@Component
public class TenantFilter implements Filter {

    @Autowired
    private TenantStore tenantStore;

    @Autowired
    private UserService userService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;

        User user = null;
        try {
            user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        } catch (UsernameNotFoundException ignored) {}

        String tenantId = user != null ? user.getSchool().getCode() : "";

        try {
            this.tenantStore.setTenantId(tenantId);
            chain.doFilter(servletRequest, servletResponse);
        } finally {
            // Otherwise when a previously used container thread is used, it will have the old tenant id set and
            // if for some reason this filter is skipped, tenantStore will hold an unreliable value
            this.tenantStore.clear();
        }
    }

    @Override
    public void destroy() {

    }
}

TenantFilterConfig.java

代码语言:javascript
运行
AI代码解释
复制
@Configuration
public class TenantFilterConfig {

    @Bean
    public Filter tenantFilter() {
        return new TenantFilter();
    }

    @Bean
    public FilterRegistrationBean tenantFilterRegistration() {
        FilterRegistrationBean result = new FilterRegistrationBean();
        result.setFilter(this.tenantFilter());
        result.setUrlPatterns(Lists.newArrayList("/*"));
        result.setName("Tenant Store Filter");
        result.setOrder(Ordered.LOWEST_PRECEDENCE-1);
        return result;
    }

    @Bean(destroyMethod = "destroy")
    public ThreadLocalTargetSource threadLocalTenantStore() {
        ThreadLocalTargetSource result = new ThreadLocalTargetSource();
        result.setTargetBeanName("tenantStore");
        return result;
    }

    @Primary
    @Bean(name = "proxiedThreadLocalTargetSource")
    public ProxyFactoryBean proxiedThreadLocalTargetSource(ThreadLocalTargetSource threadLocalTargetSource) {
        ProxyFactoryBean result = new ProxyFactoryBean();
        result.setTargetSource(threadLocalTargetSource);
        return result;
    }

    @Bean(name = "tenantStore")
    @Scope(scopeName = "prototype")
    public TenantStore tenantStore() {
        return new TenantStore();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 13:57:52

找到了另一种很好的工作方式:方面!

所使用的切入点表达式意味着该项目中控制器包中所有类的所有方法调用都会运行。

租户存储的基础是更安全地使用线程本地,以避免内存泄漏,因为它总是被清除(由于最后的块)。

编码愉快!

TenantAspect.java

代码语言:javascript
运行
AI代码解释
复制
@Component
@Aspect
public class TenantAspect {

    private final
    TenantStore tenantStore;

    @Autowired
    public TenantAspect(TenantStore tenantStore) {
        this.tenantStore = tenantStore;
    }

    @Around(value = "execution(* com.things.stuff.controller..*(..))")
    public Object assignForController(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        return assignTenant(proceedingJoinPoint);
    }

    private Object assignTenant(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        try {
            User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            if (user != null) tenantStore.setTenantId(user.getSchool().getCode());
        } finally {
            Object retVal;
            retVal = proceedingJoinPoint.proceed();
            tenantStore.clear();
            return retVal;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50615234

复制
相关文章
Spring Security 实战干货——搞清楚UserDetails
前一篇介绍了 Spring Security 入门的基础准备。从今天开始我们来一步步窥探它是如何工作的。我们又该如何驾驭它。请多多关注公众号: Felordcn 。本篇将通过 Spring Boot 2.x 来讲解 Spring Security 中的用户主体UserDetails。以及从中找点乐子。
码农小胖哥
2019/12/05
1.8K0
Spring Boot Oauth2缓存UserDetails到Ehcache
在Spring中有一个类CachingUserDetailsService实现了UserDetailsService接口,该类使用静态代理模式为UserDetailsService提供缓存功能。该类源码如下:
用户1737026
2018/08/09
9660
浅析 Spring Security 的认证过程及相关过滤器
上一篇文章 浅析 Spring Security 核心组件 中介绍了Spring Security的基本组件,有了前面的基础,这篇文章就来详细分析下Spring Security的认证过程。
BUG弄潮儿
2022/12/05
6810
浅析 Spring Security 的认证过程及相关过滤器
Springsecurity之UserDetails
                                                                       图1 UserDetails的类图
克虏伯
2019/04/15
6320
Springsecurity之UserDetails
Spring Security 案例实现和执行流程剖析
Spring Security 是 Spring 社区的一个顶级项目,也是 Spring Boot 官方推荐使用的安全框架。除了常规的认证(Authentication)和授权(Authorization)之外,Spring Security还提供了诸如ACLs,LDAP,JAAS,CAS等高级特性以满足复杂场景下的安全需求。
朝雨忆轻尘
2019/06/19
2.1K0
Spring Security 案例实现和执行流程剖析
使用Spring Security和JWT来进行身份验证和授权(三)
上述代码中,我们定义了一个名为“JwtUserDetailsService”的类,它实现了UserDetailsService接口。该类从数据库中获取用户信息,并将其转换为Spring Security用户详细信息对象。
堕落飞鸟
2023/04/14
1.9K0
Spring-Security 简介、入门案例详解、安全框架、权限验证 SSM项目 使用 JavaConfig配置
​ Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
宁在春
2022/10/31
1.1K0
Spring-Security 简介、入门案例详解、安全框架、权限验证 SSM项目 使用 JavaConfig配置
Spring Security----JWT详解
在我们传统的B\S应用开发方式中,都是使用session进行状态管理的,比如说:保存登录、用户、权限等状态信息。这种方式的原理大致如下:
大忽悠爱学习
2021/12/07
2.6K0
Spring Security----JWT详解
权限框架 | 学会Spring Security权限框架,就是这么简单
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架(简单说是对访问权限进行控制 )。
码神联盟
2019/07/31
4.5K0
权限框架 | 学会Spring Security权限框架,就是这么简单
Spring Boot:整合Spring Security
Spring Security 是 Spring 社区的一个顶级项目,也是 Spring Boot 官方推荐使用的安全框架。除了常规的认证(Authentication)和授权(Authorization)之外,Spring Security还提供了诸如ACLs,LDAP,JAAS,CAS等高级特性以满足复杂场景下的安全需求。另外,就目前而言,Spring Security和Shiro也是当前广大应用使用比较广泛的两个安全框架。
朝雨忆轻尘
2019/07/01
3.4K0
Spring Boot:整合Spring Security
Spring Security的基本概念和特点
Spring Security 是一个基于 Spring 框架的安全性解决方案,它为应用程序提供了完整的安全管理,包括认证、授权、攻击防范和会话管理等方面的功能。
堕落飞鸟
2023/04/13
4470
「快学springboot」集成Spring Security实现鉴权功能
Spring Security是Spring全家桶中的处理身份和权限问题的一员。Spring Security可以根据使用者的需要定制相关的角色身份和身份所具有的权限,完成黑名单操作、拦截无权限的操作等等。
Happyjava
2019/07/17
2.7K0
「快学springboot」集成Spring Security实现鉴权功能
Spring Security源码分析六:Spring Social社交登录源码解析
OAuth2是一种授权协议,简单理解就是它可以让用户在不将用户名密码交给第三方应用的情况下,第三方应用有权访问用户存在服务提供商上面的数据。
java干货
2021/02/19
7080
Spring Security源码分析六:Spring Social社交登录源码解析
【第九篇】SpringSecurity核心过滤器-SecurityContextPersistenceFilter
  首先来看看在spring-security-core中的SecurityContextHolder,这个是一个非常基础的对象,存储了当前应用的上下文SecurityContext,而在SecurityContext可以获取Authentication对象。也就是当前认证的相关信息会存储在Authentication对象中。
用户4919348
2022/05/18
8430
【第九篇】SpringSecurity核心过滤器-SecurityContextPersistenceFilter
Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十五):Spring Security 版本
到目前为止,我们使用的权限认证框架是 Shiro,虽然 Shiro 也足够好用并且简单,但对于 Spring 官方主推的安全框架 Spring Security,用户群也是甚大的,所以我们这里把当前的代码切分出一个 shiro-cloud 分支,作为 Shiro + Spring Cloud 技术的分支代码,dev 和 master 分支将替换为 Spring Security + Spring Cloud 的技术栈,并在后续计划中集成 Spring Security OAuth2 实现单点登录功能。
朝雨忆轻尘
2019/06/19
1.5K0
spring boot 过滤器_kotlin从入门到进阶实战
  过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
全栈程序员站长
2022/09/23
3170
spring boot 过滤器_kotlin从入门到进阶实战
Spring Security (一) Architecture Overview
国庆 + 中秋,先祝大家双节快乐!接一下推荐一下国庆还在写干货的有为少年,也就是本篇的作者,文末卡片点击可关注他的个人公众号! 一直以来我都想写一写Spring Security系列的文章,但是整个Spring Security体系强大却又繁杂。陆陆续续从最开始的guides接触它,项目中看了一些源码,到最近这个月为了写一写这个系列的文章,阅读了好几遍文档,最终打算尝试一下,写一个较为完整的系列文章。 较为简单或者体量较小的技术,完全可以参考着demo直接上手,但系统的学习一门技术则不然。以我的认知,一
程序猿DD
2018/02/01
1.1K0
Spring Security (一) Architecture Overview
Spring Security+JWT+Vue 手撸一个前后端分离无状态认证 Demo
完整代码:https://github.com/PuZhiweizuishuai/SpringSecurity-JWT-Vue-Deom
JavaFish
2020/07/03
5.7K0
Spring Security+JWT+Vue 手撸一个前后端分离无状态认证 Demo
Spring Security(一)--Architecture Overview
一直以来我都想写一写Spring Security系列的文章,但是整个Spring Security体系强大却又繁杂。陆陆续续从最开始的guides接触它,项目中看了一些源码,到最近这个月为了写一写这个系列的文章,阅读了好几遍文档,最终打算尝试一下,写一个较为完整的系列文章。 较为简单或者体量较小的技术,完全可以参考着demo直接上手,但系统的学习一门技术则不然。以我的认知,一般的文档大致有两种风格:Architecture First和Code First。前者致力于让读者先了解整体的架构,方便让我们有一
kirito-moe
2018/04/27
1K0
Spring Security(一)--Architecture Overview
Spring Security 授权详解
所有的微服务的请求都经过网关,网关从认证中心读取微服务的地址,将请求转发至微服务,注册中心采用Eureka。
ruochen
2021/12/16
2.7K0

相似问题

Spring OAuth对UserDetails的访问

23

Spring Security UserDetails缓存

18

Java Spring从Active Directory UserDetails获取属性

20

在Websocket session Spring MVC中访问UserDetails对象

33

Spring安全UserDetails最佳实践

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档