gpt4 book ai didi

java - Spring Security hasPermission 不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:23:07 25 4
gpt4 key购买 nike

我正在尝试将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com