2017-05-09 130 views
1

我有一个Spring引导(1.5.3)oauth2应用程序,它确保了URL和方法的安全。 @PreAuthorize(“hasRole(‘ROLE_NAME’)”)春季启动安全OAuth2 +自定义权限评估

现在我想添加自定义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引导oauth2应用程序中?

谢谢。

+0

我禁用了oauth2自动配置没有任何区别,所以消除了这一点。 – Chappers1975

回答

0

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

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

代替

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

造成@PreAuthorize注释被忽略。我的理解是@PreAuthorize(“hasRole ...”)正在工作是错误的 - 由于测试有时在通过Eclipse运行时成功,但从未在命令行上通过mvn运行成功时感到困惑。