SecurityContextHolder.getContext().getAuthentication() 返回 null

2022-09-02 22:12:27

我想使用以下代码手动绕过spring Security的用户:

User localeUser = new User();
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(localeUser ,null, localeUser .getAuthorities());
SecurityContext securityContext = SecurityContextHolder.getContext();
        securityContext.setAuthentication(auth);
        // Create a new session and add the security context.
        HttpSession session = request.getSession(true);
        session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
return "dummyLogin";

虚拟登录页面(由磁贴处理)在内部调用同一控制器中的不同请求映射,我试图获取类似这样的身份验证。

SecurityContextHolder.getContext().getAuthentication()

我在哪里得到空?


答案 1

所以,我发现了实际问题!问题是我在安全上下文中用 security=“none” 标记了整个控制器.xml。因此,当它从第一个链接反弹到第二个链接时,它没有通过任何安全上下文!很抱歉给您带来麻烦,伙计们。


答案 2

您的本地用户为空。因此,身份验证将变为空。因此,尚未将任何身份验证对象添加到安全上下文中。

请看一下文档

http://docs.spring.io/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/core/userdetails/User.html

最好有一个自定义用户详细信息服务

public class CustomUserDetailsService implements UserDetailsService 

//implement the method which return a UserDetails Object
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException 

那么你可以使用

    UserDetails userDetails= customUserDetailsService.loadUserByUsername("name"); 
Authentication authentication= new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()) ; 
SecurityContextHolder.getContext().setAuthentication(authentication);