我有一个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应用程序?
感谢。
答案 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运行时从未成功。