Spring Boot Security OAuth2 +自定义权限评估程序

时间:2017-05-09 09:14:39

标签: spring spring-boot spring-security spring-security-oauth2

我有一个Spring boot(1.5.3)oauth2应用程序,它已经保护了URL和方法。方法安全性目前通过以下方式工     @PreAuthorize(" hasRole(' ROLE_NAME')&#34)

我现在正在尝试添加自定义PermissionEvaluator,以便我可以使用     @PreAuthorize(" hasPermission(#id,' typeName',' permissionName')")。

我通过扩展GlobalMethodSecurityConfiguration来启用此功能:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, mode = 
AdviceMode.ASPECTJ, jsr250Enabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration 
{

    @Autowired
    private MatterRepository matterRepository;
    @Autowired
    private MatterTeamMemberRepository matterTeamMemberRepository;

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
      Map<String, Permission> permissionsMap = new HashMap<>();
      permissionsMap.put(ReadMatterPermission.class.getSimpleName(),
      new ReadMatterPermission(matterRepository, matterTeamMemberRepository));

      OAuth2MethodSecurityExpressionHandler handler = new 
      OAuth2MethodSecurityExpressionHandler();
      handler.setPermissionEvaluator(new 
          EntityPermissionEvaluator(permissionsMap));
      return handler;
    }

}

注意:为简洁起见,省略了PermissionEvaluator类。

我遇到的问题是有时会调用hasPermission - 大多数情况下都不会调用它。我怀疑这与此有关:

*Auto-configure an expression handler for method-level security (if the user 
* already has
* {@code @EnableGlobalMethodSecurity}).  
o.s.b.autoconfigure.security.oauth2.method.OAuth2MethodSecurityConfiguration

在处理我的配置之前创建OAuth2MethodSecurityExpressionHandler的实例。

有没有人成功将PermissionEvaluator注入spring boot oauth2应用程序?

感谢。

1 个答案:

答案 0 :(得分:0)

原来不是Spring安全配置问题。该问题与pom中的aspectj编译器配置有关。长话短说,AnnotationSecurityAspect的完全限定类名不正确:

org.springframework.security.access.intercept.aspectj.AnnotationSecurityAspect 

而不是

org.springframework.security.access.intercept.aspectj.aspect.AnnotationSecurityAspect

导致@PreAuthorize注释被忽略。我对@PreAuthorize(&#34; hasRole ...&#34;)工作的理解是错误的 - 因为在运行Eclipse时测试有时成功但在命令行上通过mvn运行时从未成功。