@Secured如何知道用户从数据库角色扮演的角色?

时间:2015-11-11 05:01:46

标签: java spring model-view-controller

我理解@Secured会做什么,但不确定它是如何做到的。

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

2 个答案:

答案 0 :(得分:1)

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

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

为了更好地了解幕后发生的事情,您应该查看参考指南的 Spring安全过滤器链Architecture section

答案 1 :(得分:1)

  

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子句可以确保使用finallyInvocation(InterceptorStatusToken)重新调用AbstractSecurityInterceptor并正确整理。
      • 具体子类将通过afterInvocation(InterceptorStatusToken,Object)方法重新调用AbstractSecurityInterceptor。
      • 如果RunAsManager替换了Authentication对象,则将SecurityContextHolder返回到调用AuthenticationManager后存在的对象。
      • 如果定义了AfterInvocationManager,则调用调用管理器并允许它替换将返回给调用者的对象。
  2. 请查看source code以获得更多理解。

      

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