, oauth2, API ( Authorization Bearer [TOKEN]), , .
, spring boot 1.5+, application.properties: security.oauth2.resource.filter-order=3 (1.5 )
.
spring MethodSecurityExpressionHandler , - DefaultMethodSecurityExpressionHandler. OAuth2MethodSecurityExpressionHandler oauth2, .
MethodSecurityExpressionOperations, SecurityExpressionRoot .
-, MethodSecurityExpressionOperations. // custom logic methods ( spring, ):
public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations {
private Object filterObject;
private Object returnObject;
private Object target;
CustomMethodSecurityExpressionRoot(Authentication a) {
super(a);
}
public void setFilterObject(Object filterObject) {
this.filterObject = filterObject;
}
public Object getFilterObject() {
return filterObject;
}
public void setReturnObject(Object returnObject) {
this.returnObject = returnObject;
}
public Object getReturnObject() {
return returnObject;
}
void setThis(Object target) {
this.target = target;
}
public Object getThis() {
return target;
}
public boolean securityHasPermission(String param, String anotherParam) {
}
, MethodSecurityExpressionHandler:
public class CustomOAuth2MethodSecurityExpressionHandler extends OAuth2MethodSecurityExpressionHandler {
private final AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl();
@Override
protected MethodSecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication,
MethodInvocation invocation) {
final CustomMethodSecurityExpressionRoot root = new CustomMethodSecurityExpressionRoot(authentication);
root.setThis(invocation.getThis());
root.setPermissionEvaluator(getPermissionEvaluator());
root.setTrustResolver(this.trustResolver);
root.setRoleHierarchy(getRoleHierarchy());
return root;
}
}
MethodSecurityExpressionHandler. , GlobalMethodSecurityConfiguration. @Bean MethodSecurityExpressionHandler createExpressionHandler(), :
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class Oauth2GlobalMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
return methodSecurityExpressionHandler();
}
@Bean
public MethodSecurityExpressionHandler methodSecurityExpressionHandler() {
return new CustomOAuth2MethodSecurityExpressionHandler();
}
@PreAuthorize("securityHasPermission('SOME', 'VALUE')"),
CustomMethodSecurityExpressionRoot, authentication, . /beans CustomOAuth2MethodSecurityExpressionHandler.