我正在尝试使用Spring Security 3.2保护REST Web应用程序(除了Sring Sec之外,我还使用Jersey / Guice)。 我成功地设法使用了身份验证和角色授权,但是我很难让@PostAuthorization注释处理我的方法。
这是我的spring安全配置:
<beans>
<security:global-method-security pre-post-annotations="enabled">
<security:expression-handler ref="exampleExpressionHandler"/>
</security:global-method-security>
<bean id="exampleExpressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<property name="permissionEvaluator" ref="myPermissionEvaluator"/>
</bean>
<bean id="myPermissionEvaluator" class="org.test.spring.application.security.SecurityPermissionEvaluator" />
<security:http auto-config='true' create-session='stateless' use-expressions="true" realm="My Webapp Backend">
<security:intercept-url pattern="/api/v1/**" access="hasRole('ROLE_WEB_API')"/>
<security:intercept-url pattern="/**" access="permitAll"/>
<security:http-basic />
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="webapi" password="webapi" authorities="ROLE_WEB_API" />
<security:user name="webuser" password="webuser" authorities="ROLE_WEB_USER" />
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
</beans>
以下是PermissionEvaluator的实现(非常简单应该拒绝所有):
public class SecurityPermissionEvaluator implements PermissionEvaluator
{
private static Logger logger = LoggerFactory.getLogger(SecurityPermissionEvaluator.class);
@Override
public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission)
{
logger.info("=YAH= Security Evaluator hasPermission() invoked");
return false;
}
@Override
public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission)
{
logger.info("=YAH= Security Evaluator hasPermission2() invoked");
return false;
}
public SecurityPermissionEvaluator()
{
logger.info("=YAH= Security Evaluator created");
}
}
最后这里是我希望触发我的权限评估程序的代码
@GET
@PostFilter("hasPermission(filterObject, 'read')")
public List<MyDTO> getHomePages()
{
return myDTOAssembler.toDTOList(hompepageRepo.findAll());
}
当我访问我的资源时,我从未收到任何“= YAH =”日志消息,似乎我的评估者永远不会被调用也不会被创建。
春天报告启动应用程序时没有错误,所以两者都没有。
我很确定这是一个配置问题,但我确实遵循了指南和SO q / a而无法提供更好的功能。
所以,如果你有任何建议,我会非常高兴,因为我对Spring世界真的很陌生。