如何在JSP页面中配置Spring Security以允许使用hasPermission?
问题内容:
我正在尝试从spring项目的jsp页面中使用hasPermission。我已经在我的控制器/服务类的方法中毫无问题地使用了它。阅读文章:
http://docs.spring.io/spring-
security/site/docs/4.0.0.M1/reference/htmlsingle/#the-accesscontrollist-
tag
从官方文档中,我了解到,为此,我将需要实现一个从DefaultPermission派生的类,该类将从自定义AclService类加载。
我的问题是我找不到有关如何实现所有这些类的任何信息,甚至不知道这种方法是唯一的还是我以正确的方式理解了该主题(官方文档对此主题非常简短)
,而在互联网的其余部分,我找不到更多信息)。
任何人都可以在这里指出正确的方向吗?也许指示一些教程或代码示例。
更新
从StackOverflow读取其他主题,我发现了这种建议:
This is what I have done. I created my own permission evaulator:
> public class MyPermissionEvaluator implements PermissionEvaluator {
> ...
> }
Then I configured spring to use that evaulator via
> <beans:bean id="expressionHandler"
> class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
> <beans:property name="permissionEvaluator" ref="permissionEvaluator"/>
> </beans:bean>
>
> <beans:bean id="webExpressionHandler"
> class="com.bulb.learn.webapp.security.CustomWebSecurityExpressionHandler">
> <beans:property name="permissionEvaluator" ref="permissionEvaluator"/>
> </beans:bean>
>
> <beans:bean id="permissionEvaluator" class="my.domain.MyPermissionEvaluator" />
That way all expression handlers have access to my evaulator. Then, in JSP (actually, I am using jspx), I can make tags like this:
> <sec:authorize access="hasPermission(#childUnit, 'read')">
> ...
> </sec:authorize>
Hope that gets you heading in the right direction.
因为我已经有一个Custom
PermissionEvaluator,所以我尝试了这种方法。它可以部分工作,但是现在,即使在用户具有权限的情况下,也不会显示标记内的元素。同样,日食表示与此标签有关的错误(“令牌语法错误,构造位置错误”),尽管正在构建和执行应用程序而没有错误。
在控制台中,显示此错误:
un 03, 2014 7:48:40 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'cadastra_usuario' on object null
Jun 03, 2014 7:48:40 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'altera_usuario' on object null
Jun 03, 2014 7:48:40 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'remove_usuario' on object null
Jun 03, 2014 7:48:45 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'cadastra_permissao' on object null
Jun 03, 2014 7:48:45 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'altera_permissao' on object null
Jun 03, 2014 7:48:45 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'remove_permissao' on object null
Jun 03, 2014 7:48:57 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'cadastra_usuario' on object null
Jun 03, 2014 7:48:57 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'altera_usuario' on object null
Jun 03, 2014 7:48:57 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'remove_usuario' on object null
在Internet上,我发现有些文章表示我应该为WebSecurityExpressionHandler实现接口。
有人知道这里正确的步骤吗?
更新2
以前,我使用此标签:
<sec:accesscontrollist hasPermission="1,2" domainObject="${someObject}">
如果用户在给定对象上具有由值“ 1”或“ 2”表示的任一权限,则将显示此信息。
</sec:accesscontrollist>
在控制台中未显示任何错误的位置,但仍然无法正常工作。我的问题是我需要实现哪个对象来为标签的domainObject分配属性?
问题答案:
您CustomPermissionEvaluator
的电话未被呼叫。
尝试在SecurityConfig.java中遵循以下代码。
...
import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler;
...
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
@Override
public void configure(WebSecurity web) throws Exception {
DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
handler.setPermissionEvaluator(new CustomPermissionEvaluator());
web.expressionHandler(handler);
}
}
Web应用程序初始化器
...
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
...
public class AnnotationConfigDispatcherServletInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {
SecurityConfig.class,
};
}
}