java - 我不知道使用什么 SecurityContextHolder 策略

标签 java spring spring-security security-context

我使用这样的代码进行身份验证:

@PreAuthorize("isAnonymous()")
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String doLogin(HttpServletRequest request) {
    try {
        Authentication req = new UsernamePasswordAuthenticationToken(request.getParameter("name"),
                request.getParameter("password"));
        Authentication result = authenticationManager.authenticate(req);
        SecurityContextHolder.getContext().setAuthentication(result);
        logger.debug("Success login");
        logger.debug(SecurityContextHolder.getContext().getAuthentication());
        return "index";
    } catch (AuthenticationException e) {
        e.printStackTrace();
        logger.debug("ACHTUNG! Success failed");
        return "index";
    }
}

我可以登录,它可以工作。我在日志中看到非空身份验证对象。 然后我尝试浏览一些安全页面,如下所示:

@PreAuthorize("hasRole('user')")
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String user(ModelMap modelMap) {
    modelMap.addAttribute("user", SecurityContextHolder.getContext().getAuthentication().getCredentials().toString());
    return "index";
}

由于 getAuthentication(),它会抛出 NullPointerException。 当我使用 SecurityContextHolder.MODE_INHERITABLETHREADLOCAL 和 SecurityContextHolder.MODE_INHERITABLETHREADLOCAL 时,会发生这种情况,这与使用 SecurityContextHolder.MODE_GLOBAL 不同。

我做错了什么?我不需要 SecurityContextHolder 的 MODE_GLOBAL 行为。

UPD:有时会出现问题,有时不会在同一 session 中出现。

最佳答案

通过记录以下内容来绝对确保安全过滤器每次在您的请求中都运行:

request.getAttribute("__spring_security_scpf_applied");

不要。除非您绝对知道自己在做什么,否则不要替换 SecurityContextHolderStrategy。它与基于 ThreadLocal 查找 SecurityContext 有关。因此,除非您的 Servlet 容器非常奇怪,否则默认值几乎总是正确的。

您还需要为您的请求路径创建一个拦截器。 @PreAuthorize 仅适用于方法调用 http://static.springsource.org/spring-security/site/docs/3.0.x/reference/el-access.html这不是你想要的。

相反,您希望在安全应用程序上下文中执行以下操作:

<http> ...
        <intercept-url pattern="/user**" access="hasRole('user')" />
</http>

关于java - 我不知道使用什么 SecurityContextHolder 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10191232/

相关文章:

grails - OAuth 2.0 for Grails没有Spring安全性

java - 洪水填充扫描线

java - Google 在 Appcompactivity 中的 AutoCompleteTextView 上放置 api 调用 - Android

java - LDAP 与 MYSQL..JA-SIG CAS 与 LDAP 对比 CAS 与 MySQL

java - Spring Security - 多个身份验证提供者

java - 相同属性的@NotNull 和@NotEmpty

java - 精度损失

java - 从 python 编译 java

encryption - 如何使用 BCryptPasswordEncoder 解码密码?

java - Spring 启动 : Customize API response based on the User Roles