如何在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,
    };
  }
}