【问题标题】:Grails Spring Security Get Roles for the Current PageGrails Spring Security 获取当前页面的角色
【发布时间】:2014-03-31 04:13:06
【问题描述】:

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

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

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

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

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

Grails 2.2.1 版 Spring Security 插件 1.2.7.3 版

提前致谢

【问题讨论】:

    标签: grails spring-security


    【解决方案1】:

    我通过将以下两个类添加到我的 src/java 来实现此功能。

    第一类

    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; }
    }
    

    第二类

    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 上的其他精彩帖子中窃取来拼凑我的解决方案。其他人可能有更好的解决方案,但到目前为止这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-10
      • 2012-04-22
      • 2013-02-07
      • 2013-08-26
      • 2011-09-21
      • 2017-05-18
      • 2010-11-26
      • 2012-02-09
      相关资源
      最近更新 更多