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

时间:2014-03-05 07:33:17

标签: java spring security spring-security

我想使用以下代码从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()

我在哪里获得无效!!!。

请帮助!

4 个答案:

答案 0 :(得分:9)

所以我发现了实际的问题! 问题是我在security-context.xml中用security =“none”标记了整个控制器。 因此,当它从第一个链接弹回到第二个链接时,它会通过任何安全上下文! 对不起家伙们抱歉。

答案 1 :(得分:2)

其他答案:如果您想获取非安全网址的登录用户详细信息,则可以将其添加到安全网址并指定为" permitAll"像这样:

<http>
    //...

    <intercept-url pattern="/your/url/**" access="permitAll"/>

    //...
</http>

然后,您将能够在登录时检查登录用户或获取凭据。

答案 2 :(得分:0)

您的localUser为null。因此,auth变为null。因此,安全上下文中未添加任何身份验证对象。

请查看文档

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

最好有一个customUserDetailsS​​ervice

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);

答案 3 :(得分:-3)

试试这个:

Authentication authentication=SecurityContextHolder.getContext().getAuthentication();
localeUser .setUserNm(authentication.getName());