gpt4 book ai didi

Grails Spring Security 获取当前页面的角色

转载 作者:行者123 更新时间:2023-12-02 14:02:11 25 4
gpt4 key购买 nike

我想知道是否有人知道一种优雅的方法来获取可以访问当前页面的 spring 安全插件中的所有角色。

我正在使用 spring security,它被配置为使用 RequestMap 域对象。

我的应用程序中的权限非常复杂,所以我想在每个页面的底部制作一个标签,显示使用该页面所需的角色。

我正在查询请求映射,但我想确保我匹配 url 的方式与插件的方式相同。

理想情况下,我根本不必运行查询。

Grails 2.2.1 版 Spring Security 插件 1.2.7.3 版

提前致谢

最佳答案

我通过将以下两个类添加到我的 src/java 中来实现这一点。

1级

import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;

import javax.servlet.http.HttpServletRequest;
import java.util.Collection;

public class MyFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {

FilterInvocationSecurityMetadataSource oldBean;

@Override
public Collection<ConfigAttribute> getAttributes(Object o) throws IllegalArgumentException {
FilterInvocation filterInvocation = (FilterInvocation) o;
HttpServletRequest request = filterInvocation.getHttpRequest();
request.setAttribute("PAGEROLES", oldBean.getAttributes(filterInvocation));

return oldBean.getAttributes(o);
}

@Override
public Collection<ConfigAttribute> getAllConfigAttributes() {
return oldBean.getAllConfigAttributes();
}

@Override
public boolean supports(Class<?> aClass) {
return FilterInvocation.class.isAssignableFrom(aClass);
}

public Object getOldBean() { return oldBean; }
public void setOldBean(FilterInvocationSecurityMetadataSource oldBean) { this.oldBean = oldBean; }
}

2 级
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;

public class FilterSecurityMDSExtractor implements BeanPostProcessor, BeanFactoryAware {
private ConfigurableListableBeanFactory bf;
private FilterInvocationSecurityMetadataSource metadataSource = new MyFilterInvocationSecurityMetadataSource();

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof FilterInvocationSecurityMetadataSource) {
((MyFilterInvocationSecurityMetadataSource) metadataSource).setOldBean((FilterInvocationSecurityMetadataSource) bean);
return metadataSource;
}
return bean;
}

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}

public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.bf = (ConfigurableListableBeanFactory)beanFactory;
}
}

然后我将以下内容添加到 resources.groovy
beans = {
filterSecurityMDSExtractor(FilterSecurityMDSExtractor)
}

基本上我将用户角色填充到请求中
request.setAttribute("PAGEROLES", oldBean.getAttributes(filterInvocation));

那么我所要做的就是调用以下
request.getAttribute("PAGEROLES");

让角色回来。我通过从 Stackoverflow 上的其他精彩帖子中窃取来拼凑我的解决方案。其他人可能有更好的解决方案,但到目前为止这对我有用。

关于Grails Spring Security 获取当前页面的角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22073486/

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