我想使用以下代码从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()
我在哪里获得无效!!!。
请帮助!
答案 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。因此,安全上下文中未添加任何身份验证对象。
请查看文档
最好有一个customUserDetailsService
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());