0

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

@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返回登录用户正确

为什么这样?

4

1 回答 1

0

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

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

<security:http ... />
    ...
    <security:intercept-url pattern="/userstuff/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    ....
</security:http>
于 2013-09-10T14:47:57.020 回答