【问题标题】:Use methods directly that back spring security's built-in expressions直接使用返回 spring security 的内置表达式的方法
【发布时间】:2012-10-05 10:51:59
【问题描述】:

我想在我的控制器中使用一些与 built-in expressions provided by Spring Security 类似的 (Java) 方法,例如hasRole([role]) 或 isFullyAuthenticated()。

你知道我在哪里可以找到这些方法以及如何在控制器的 Java 方法中调用它们(我不想使用 Spring EL,我想使用纯 Java)?例如像

SomeStaticSpringSecutityClass.isFullyAuthenticated();

编辑:

SecurityContextHolder.getContext().getAuthentication().isAuthenticated()

实际上并没有真正起作用。如果用户被认证为“匿名”,此方法也返回 true。请参阅上面的 spring 安全文档的链接:

isAuthenticated() 如果用户不是匿名的,则返回 true

相反,您必须使用类似的东西:

public boolean isAuthenticated() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    return !(authentication == null || authentication instanceof AnonymousAuthenticationToken);
}

但无论如何:我真的不想再次实现逻辑,这已经在 Spring Security 的某个地方实现了。另外

SecurityContextHolder.getContext().getAuthentication()

没有提供 isFullyAuthenticated() 或 hasRole() 等方法。

【问题讨论】:

    标签: java spring spring-security


    【解决方案1】:

    看看org.springframework.security.core.contex.SecurityContextHolder。例如检查当前用户是否经过身份验证:

    SecurityContextHolder.getContext().getAuthentication().isAuthenticated()
    

    【讨论】:

    • 小心处理,匿名用户会这样
    【解决方案2】:

    我找到了使用该接口的SecurityContextHolderAwareRequestFilter

    AuthenticationTrustResolver.isAnonymous(Authentication authentication);
    

    如果你想使用Spring源代码,你可以查看实例化这个接口的类SecurityContextHolderAwareRequestWrapper如下:

    private final AuthenticationTrustResolver authenticationTrustResolver = new AuthenticationTrustResolverImpl();
    
    public Authentication getAuthentication() {
        if (!authenticationTrustResolver.isAnonymous(auth)) {
            return auth;
        }
        return null;
    }
    

    我查看了文档,但没有找到可以执行此操作的实用程序类。

    【讨论】:

      猜你喜欢
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      相关资源
      最近更新 更多