Spring-Security:优化获取当前经过身份验证的用户...

Posted

技术标签:

【中文标题】Spring-Security:优化获取当前经过身份验证的用户...【英文标题】:Spring-Security : Optimizing get currently authenticated user… 【发布时间】:2015-10-28 04:28:47 【问题描述】:

我正在开发一个使用 Spring-Security 进行身份验证的 Spring-MVC 应用程序。由于过度使用获取当前经过身份验证的用户机制,Profiler 将其显示为“分配热点”,单个用户消耗了近 9.5kb 的内存。有没有办法优化这个基础设施。

PersonServiceImpl :

 @Override
    public Person getCurrentlyAuthenticatedUser() 
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null) 
            return null;
         else 
            return personDAO.findPersonByUsername(authentication.getName());
        
    

如果我总能以某种方式将用户推送到某个缓存中,从第一次检索后检索它的位置,至少应该会提高性能,但我不知道该怎么做。欢迎任何建议。谢谢。

【问题讨论】:

也许Spring Cache 可以在这里为您提供帮助。 Spring Cache 首先检查某个方法和键(可以自定义)的值是否可用,如果可用,将返回缓存命中而不输入方法。如果未命中,它将执行该方法并将返回值放入缓存中。挑战在于提供用户会话独有的密钥。 @RomanVottner 看起来很有希望。我现在刚刚放了cacheable注解,但是参数cacheNames不可用。我相信它在较新的版本中已被删除。注释应该够吗? 您可以在类级别通过@CacheConfig(cacheNames="yourName", keyGenerator="customKeyGenerator", ...) 声明cacheNames,只需用@Cacheable注释每个应该使用缓存的方法 【参考方案1】:

您可以使用一些变体。但您也可以尝试仅使用 Spring: 1. 扩展 org.springframework.security.core.userdetails.User 并添加到你的 UserEntity(Person)中

public class User extends org.springframework.security.core.userdetails.User 
    private Person sysUser; 

  public User(Person sysUser) 
        super(sysUser.getLogin(), sysUser.getPassword(), new ArrayList<>());
        this.sysUser = sysUser;
    

public Person getYourUser()
return sysUser;



    使用您的用户实体和扩展的 org.springframework.security.core.userdetails.User 实现 UserDetailsS​​ervice

    @Service(value = "userService")
    public class UserService implements UserDetailsService 
    @Autowired
    SecurityDAO securityDAO;
    
    @Override
    public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException 
        User user = null;
        try 
            Person su = securityDAO.getUserOnlyByLogin(login);
            if (su != null)
                user = new User(Person);
    
         catch (Exception e) 
    
            e.printStackTrace();
        
    
    
        return user;
    
    

    配置您的 Spring(xml 或 Annotation):

 <beans:bean id="userService" class="your.pack.UserService"/>
    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="userService"/>
    </authentication-manager>

    用你的方法

    @Override

       public Person getCurrentlyAuthenticatedUser() 
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    
            if (authentication == null) 
                return null;
             else   User user = (User) authentication.getPrincipal();
                return user.getYourUser();
            
        
    

【讨论】:

我不明白这是什么意思,我的登录代码已经在工作了。 此代码允许使用 Spring 上下文来保存有关您的用户的信息。但是如果你需要每次对数据库做一个请求我可以建议EHCache

以上是关于Spring-Security:优化获取当前经过身份验证的用户...的主要内容,如果未能解决你的问题,请参考以下文章

spring-security:多少定制是明智的?

在使用 Oauth、SAML 和 spring-security 的多租户的情况下从 spring-security.xml 中获取错误

在 spring-security 的身份验证中无法获取自定义信息

spring-security

如何使用 Spring Security 获取当前用户的角色

如何使用 Vuejs 和 Laravel 获取当前经过身份验证的用户 ID?