无法访问登录用户信息的Spring Security

时间:2013-09-10 14:35:19

标签: java spring security spring-mvc spring-security

我在我的网络应用程序中使用Spring Security进行身份验证 现在,我需要访问用户信息,Controller中存在以下方法:

@RequestMapping(value = "/userstuff")
@Controller
public class SomeUserController {

    @RequestMapping(value = "getUser", method = RequestMethod.GET)
    @ResponseBody
    public UserDetails getUser(Locale locale, Model model) {
        UserDetails userDetails = null;
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        if (authentication != null) {
            Object principal = authentication.getPrincipal();
            userDetails = (UserDetails) (principal instanceof UserDetails ? principal
                    : null);
        }
        return userDetails;
    }

}

如果控制器URL在applicationContext-Security.xml中没有进行安全检查:

<security:http pattern="/userstuff/**" security="none" /> 

然后调用

http:// host:port / app / userstuff / getUser - 返回null

但是,如果确实将其评论出来(允许弹簧安全拦截它):

<!-- <security:http pattern="/userstuff/**" security="none" /> -->

然后调用:
http:// host:port / app / userstuff / getUser 返回正确登录用户

为什么会这样?

1 个答案:

答案 0 :(得分:0)

当您使用security="none" 时,所有春季安全过滤器都将关闭(请参阅官方文档中的this entry)。所以没有SecurityContextHolder,没有@PreAuthorize,没有其他Spring Security功能可用。例如,通常SecurityContextHolder由安全过滤器链中的一个过滤器填充。

作为一种解决方法几乎总是可以通过限制仅为匿名用户替换security="none"构造:

<security:http ... />
    ...
    <security:intercept-url pattern="/userstuff/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    ....
</security:http>