java - Spring Security hasPermission 不起作用

标签 java spring spring-mvc spring-security

我正在尝试将 Spring Security 集成到我的 Spring Web 应用程序中。基本上我需要根据用户权限隐藏一些菜单。这是我所做的。

我在类路径下添加了 JARS。

spring-security-acl-4.0.2.RELEASE.jar
spring-security-config-4.0.2.RELEASE.jar
spring-security-core-4.0.2.RELEASE.jar
spring-security-taglibs-4.0.1.RELEASE.jar
spring-security-web-4.0.2.RELEASE.jar

下面是web.xml中的条目

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>/WEB-INF/web_log4j.xml</param-value>
</context-param>

<listener>
    <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-root.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

我写了一个 CustomPermissionEvaluator 类,如下所示。

public class CustomPermissionEvaluator implements PermissionEvaluator{


@Override
public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
    HttpServletRequest request = (HttpServletRequest) targetDomainObject;
    Profile userProfile = (Profile) request.getSession().getAttribute("testprofile");
    if (userProfile.getPermissionMap().get(String.valueOf(permission)) != null) {
        return true;
    } else {
        return false;
    }
}

@Override
public boolean hasPermission(Authentication arg0, Serializable arg1,
        String arg2, Object arg3) {
    // TODO Auto-generated method stub
    return false;
}

在此之后我编写了 SecurityConfig 文件。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
public void configure(WebSecurity web) throws Exception {
    DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
    handler.setPermissionEvaluator(new CustomPermissionEvaluator());
    web.expressionHandler(handler);
}

我的 spring-root.xml 中有以下条目

<sec:global-method-security pre-post-annotations="enabled">
    <sec:expression-handler ref="expressionHandler" />
</sec:global-method-security>
<bean id="expressionHandler"
    class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
    <property name="permissionEvaluator" ref="permissionEvaluator" />
</bean>
<bean id="permissionEvaluator" class="main.java.com.config.CustomPermissionEvaluator" />

现在在我的 JSP 文件中,我正在使用下面的 taglib。

及以下代码

<sec:authorize access="hasPermission('cadastra_categoria', #request)">      
                <div id="TEST">
                </div>
            </sec:authorize>

但它不起作用。任何建议将不胜感激。

最佳答案

"hasPermission('cadastra_categoria', #request)"

实际上,有效调用必须交换参数,第一个必须是目标域对象,第二个 - 权限:

hasPermission(#request, 'cadastra_categoria')

我假设您还仔细检查了是否已按要求将 sec taglib 导入到您的 JSP 中

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

最后,正如本 answer 的第二部分所阐明的那样, 定义如下:

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AnnotationConfigDispatcherServletInitializer extends
    AbstractAnnotationConfigDispatcherServletInitializer {

  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class[] {
      SecurityConfig.class //your SecurityConfig
    };
  }
}

确保在 Web 应用程序启动期间调用 configure(WebSecurity web)

关于java - Spring Security hasPermission 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45878283/

相关文章:

java - SpringMVC、null spring beans、servlet 和 Apache Thrift

java - 将 org.hibernate.jpa.HibernatePersistenceProvider 与 BoneCP 一起使用时遇到错误

java - 如何在 Spring Boot 中测试 REST 端点是否返回数字?

java - 为什么我需要在此 Java 示例中强制转换 HttpURLConnection?

Java数据结构让一个方法只有在被调用N次后才会触发

java - Spring JPA - MySQL 数据库创建外键时 Hibernate 出错

spring-mvc - 在spring mvc项目中使用@CachePut,但是在redis中获取key和value两个单独的数据

java - 数据未使用 Spring DATA 持久保存到数据库中

java - 字符串函数如何计算字符串行中的分隔符

java - 获取 java.lang.reflect.Type 的简单代码