我发现了oauth2。我设法创建了一个返回JWToken和REST的示例,该示例受此令牌保护。 现在我想通过在受保护的REST接口中添加访问控制来改进这一点。 为什么?因为我想像ADMIN,READER这样的用户访问某些URL。
关注http://projects.spring.io/spring-security-oauth/docs/oauth2.html 它可能在http节点中的表达式处理程序。 这是我添加到我的xml配置中的配置:
<sec:global-method-security
pre-post-annotations="enabled" />
<sec:http pattern="/protected/**" create-session="never" entry-point-ref="oauthAuthenticationEntryPoint">
<sec:anonymous enabled="false" />
<sec:intercept-url pattern="/protected/**" />
<sec:custom-filter ref="resourceServerFilter"
before="PRE_AUTH_FILTER" />
<sec:access-denied-handler ref="oauthAccessDeniedHandler" />
<sec:expression-handler ref="myexpressionHandler" />
</sec:http>
<bean id="myexpressionHandler" class="org.springframework.security.oauth2.provider.expression.OAuth2WebSecurityExpressionHandler">
</bean>
日志: FEVR。 04,2015 4:09:31 PM org.springframework.security.config.method.GlobalMethodSecurityBeanDefinitionParser parse INFOS:已为方法安全性启用了表达式,但未配置SecurityExpressionHandler。所有hasPermision()表达式都将计算为false。 FEVR。 04,2015 4:09:31 PM org.springframework.security.config.http.HttpSecurityBeanDefinitionParser checkFilterChainOrder
但是凭借我的JWTtoken,我成功获得了受保护的资源。
我的控制器:
@Component
@RestController
@RequestMapping(value = "/protected")
public class HelloWorldRest {
private static final Logger LOG = LoggerFactory
.getLogger(HelloWorldRest.class);
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@PreAuthorize("#oauth2.clientHasRole('ROLE_ADMIN')")
@RequestMapping(value = "/greeting/{name}")
public Greeting greeting(@PathVariable String name) {
LOG.info("Fonction greeting : " + name);
return new Greeting(counter.incrementAndGet(), String.format(template,
name + ", I am Mister Toto"));
}
}
我已经与获得authorityGrant = {ROLE_NONE}
的用户进行了测试谢谢, 有什么想法吗?
答案 0 :(得分:0)
要避免错误消息“已配置SecurityExpressionHandler”,您应该将表达式处理程序添加到global-method-security。像这样:
<sec:global-method-security pre-post-annotations="enabled">
<sec:expression-handler ref="oauthExpressionHandler" />
</sec:global-method-security>
<oauth:expression-handler id="oauthExpressionHandler" />
您可以另外使用:
而不是为WebSecurityExpressionHandler定义自己的bean(正如您在问题中所做的那样)<oauth:web-expression-handler id="oauthWebExpressionHandler" />