我有一个Spring boot (1.5.3) oauth2应用程序,它保护了URL和方法。方法安全性目前通过:@PreAuthorize("hasRole('ROLE_NAME')")
我现在正在尝试添加一个自定义类型,这样我就可以用@ PermissionEvaluator (“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应用程序?
谢谢。
发布于 2017-05-10 11:29:20
事实证明,这不是一个spring安全配置问题。该问题与pom中的aspectj编译器配置有关。长话短说,AnnotationSecurityAspect的完全限定类名不正确:
org.springframework.security.access.intercept.aspectj.AnnotationSecurityAspect
而不是
org.springframework.security.access.intercept.aspectj.aspect.AnnotationSecurityAspect
导致@PreAuthorize注释被忽略。我的理解是@PreAuthorize("hasRole...")测试有时会在通过Eclipse运行时成功,但在命令行上通过mvn运行时永远不会成功,这让人困惑。
https://stackoverflow.com/questions/43865800
复制相似问题