【问题标题】:How does @Secured know what role a user is from database?@Secured 如何知道用户在数据库中的角色?
【发布时间】:2015-11-11 05:01:46
【问题描述】:

我了解 @Secured 的作用,但不确定它是如何做到的。

有人能解释一下@Secured 是如何获得这些角色的吗?它是从authorities-by-username-query 得到的吗?只要它在数据库中,我可以将任何字符串放入参数中吗?

【问题讨论】:

  • 它从SecurityContext 获取角色。用户的角色在身份验证过程中存储在安全上下文中,例如使用您提到的 authorities-by-username-query 查询检索它们(取决于您的确切配置)。
  • 啊啊啊我明白了,非常感谢。如果您愿意,可以将其发布为答案,我会接受的

标签: java spring model-view-controller


【解决方案1】:

用户的角色存储在SecurityContext 中,或者更具体地说,存储在SecurityContext 中的Authentication 对象中。当您进行身份验证时,身份验证信息会加载并存储在安全上下文中。角色可以源自数据库,具体取决于您的配置。在您的情况下,它们是使用 authorities-by-username-query 查询加载的。

当安全拦截器处理授权(例如使用@Secured注解的方法级授权)时,它会根据上下文中存储的身份验证来确定用户是否应该能够访问它。


为了更好地了解幕后发生的事情,您应该查看参考指南的 Spring Security Filter 链Architecture section

【讨论】:

    【解决方案2】:

    SpringSecurity 提供了很棒的 AOP 方法来保护方法 使用@Secured 的Java 应用程序。 Spring 对角色进行逻辑 OR 在@Secured 注释中列出。 GrantedAuthorities 集合来自SecurityContextHolder.getContext().getAuthentication().getAuthorities()

    AbstractSecurityInterceptor 是实现的抽象类 安全对象的安全拦截。

    1. 从 SecurityContextHolder 中获取 Authentication 对象。

      1. 确定请求是否涉及安全或公共调用 通过针对 SecurityMetadataSource 查找安全对象请求。
      2. 对于安全的调用(有一个列表 用于安全对象调用的 ConfigAttributes):

        • 如果 Authentication.isAuthenticated() 返回 false,或者 alwaysReauthenticate 为 true,则根据配置的 AuthenticationManager 对请求进行身份验证。通过身份验证后,将 SecurityContextHolder 上的 Authentication 对象替换为返回值。
        • 根据配置的 AccessDecisionManager 授权请求。
        • 通过配置的 RunAsManager 执行任何 run-as 替换。
        • 将控制权交还给具体子类,具体子类将继续执行对象。返回一个 InterceptorStatusToken,以便在子类完成执行对象后,其 finally 子句可以确保重新调用 AbstractSecurityInterceptor 并使用 finallyInvocation(InterceptorStatusToken) 正确整理。
        • 具体子类将通过 afterInvocation (InterceptorStatusToken, Object) 方法重新调用 AbstractSecurityInterceptor。
        • 如果 RunAsManager 替换了 Authentication 对象,则将 SecurityContextHolder 返回给调用 AuthenticationManager 后存在的对象。
        • 如果定义了 AfterInvocationManager,则调用调用管理器并允许它替换应返回给调用者的对象。

    查看source code了解更多。

    AccessDecisionManager 是实现为 AffirmativeBased、ConsensusBased 或 UnanimousBased 的接口,用于协调投票者并依次询问每个请求用户是否应该通过 @Secured 注释或拒绝。

    【讨论】:

    • 哇,比我想象的要复杂一点。谢谢!
    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多