【发布时间】:2014-07-21 09:55:30
【问题描述】:
我正在尝试在我的 spring 项目的 jsp 页面中使用 hasPermission。我已经在我的控制器/服务类的方法中毫无问题地使用它。阅读文章:
从官方文档中,我了解到为此我需要实现一个派生自 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.
因为我已经有一个自定义 PermissionEvaluator,所以我尝试了这个方法。它部分工作,但现在,即使用户拥有权限,标签内的元素也不会显示。此外,尽管应用程序的构建和执行没有错误,但 Eclipse 会指示与此标记相关的错误(“令牌上的语法错误,错误的构造”)。
在控制台中,显示此错误:
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
在互联网上,我发现一些文章建议我应该为 WebSecurityExpressionHandler 实现一个接口。
有人知道这里的正确步骤是什么吗?
更新 2
以前,我使用的是这个标签:
<sec:accesscontrollist hasPermission="1,2" domainObject="${someObject}">
如果用户对给定对象具有值“1”或“2”所代表的权限,则会显示此信息。
</sec:accesscontrollist>
在控制台中没有显示错误,但仍然无法正常工作。我的问题是我需要实现哪个对象来归属标签的 domainObject?
【问题讨论】:
-
@see docs.spring.io/spring-security/site/docs/4.0.0.M1/reference/… JSP 标记库 例如
此内容仅对列表中具有“主管”权限的用户可见GrantedAuthority。 -
我的代码中已经有了这个标签,按照链接中的说明(我已经看过)。而且我不想使用hasRole,而是hasPermission:我的应用程序中有角色和权限(每个Role可以有多个Permissions,用户可以创建新的Roles来关联需要关联的Permissions)。
-
我的项目中有这个类 PermissionEvaluator,我在我的方法(在控制器和服务类中)使用带有参数 hasPermission 的注释 @PreAuthorize。但我无法在我的 JSP 页面中使用。在这里查看我的配置:github.com/klebermo/lojavirtual/tree/master/src/main/java/com/…
标签: spring jsp spring-mvc spring-security acl