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

Posted

技术标签:

【中文标题】在 spring-security 的身份验证中无法获取自定义信息【英文标题】:Can not get custom information in Authentication of spring-security 【发布时间】:2020-08-26 18:30:20 【问题描述】:

这是我在授权服务器中的AuthenticationProvider

@Service
public class UmUserAuthenticationProvider implements AuthenticationProvider 

    @Autowired
    @Qualifier("UmUserDetailsService")
    private UserDetailsService userDetailService;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException 
        // TODO Auto-generated method stub

        String username = authentication.getName();
        String password = (String) authentication.getCredentials();

        long userId = (new SecurityUtil()).checkUser(umUserMapper, username, password);
        if (userId <= 0) 
            throw new BadCredentialsException("login failed");
        
        UserDetails user = userDetailService.loadUserByUsername(username);

        //I've try different ways to put user detail in here
        UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, null,
                user.getAuthorities());
        auth.setDetails(user);
        return auth;
    

    @Override
    public boolean supports(Class<?> authentication) 
        // TODO Auto-generated method stub
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    


这是我的资源服务器,我无法获取我在Authentication 中设置的内容,

getPrincipalString

getDetailsorg.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails 的类型

@RequestMapping("/test")
public class UserController 



    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public String getRouters() 
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        logger.info(auth.getPrincipal().toString());
        logger.info(auth.getDetails().toString());


        JSONObject jo = new JSONObject();

        return jo.toString();
    


记录器打印

那么我如何在Authentication 中获取自定义详细信息?

【问题讨论】:

您要实施什么样的身份验证?智威汤逊?在我看来,这是在 Spring Security 中实现身份验证的一个奇怪的奇怪解决方案 【参考方案1】:

最后,我用诡计解决了这个问题

无论我在UsernamePasswordAuthenticationToken中设置什么,我都得到了String的类型,所以我用json字符串填充它;


UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
                new JSONObject(user).toString(), password, userDetailService.getAuthorities(username));

这样我就可以在控制器上解析 json 字符串了。

但我还是想知道是什么原因造成的

【讨论】:

【参考方案2】:

我认为问题在于,您在身份验证时设置了UserDetails,但默认情况下会覆盖它。

自定义身份验证转换器可能是解决方案。

public class CustomAuthenticationConverter implements Converter<Jwt, AbstractAuthenticationToken> 

    @Override
    public AbstractAuthenticationToken convert(@NotNull final Jwt jwt) 
        String username = jwt.getClaimAsString("username");
        UserDetails user = userDetailService.loadUserByUsername(username);
        return new UsernamePasswordAuthenticationToken (jwt, user, userDetailService.getAuthorities(username)));
    


【讨论】:

以上是关于在 spring-security 的身份验证中无法获取自定义信息的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Security:MySQL JDBC 身份验证失败

通过 Active Directory LDAP 使用 Spring-Security 进行身份验证

如何使用我自己的机制自定义 spring-security 身份验证过程

ASP.Net中无刷新执行Session身份验证

window10家庭版解决IIS中万维网服务的安全性中无Windows身份验证

如何使用 Spring Security 模拟身份验证和授权