【问题标题】:Get Spring Security intercept urls from database or properties从数据库或属性中获取 Spring Security 拦截 url
【发布时间】:2011-01-19 22:16:00
【问题描述】:

希望这是超级简单的,存在的,而且我正在忽略我眼皮底下的一些东西。我知道我可以通过注释限制访问:

@Secured({"ROLE_ADMIN"})

或通过配置:

<security:intercept-url pattern="/**" access="ROLE_USER, ROLE_ADMIN, ROLE_SUPER_USER" />

我希望从数据库中获取身份验证规则,例如:

<security:intercept-url provider="authProvider"/>

<bean id="authProvider" class="AuthProviderImpl">
    <property name="userDetailsService" ref="userDetailsService"/>
</bean>

最坏的情况,必须有一种通过属性文件填充的方法吗?...

/admin/**=ROLE_ADMIN
/**=ROLE_USER

<security:intercept-url props="classpath:urls.properties"/>

等等

请告诉我这存在,否则我的大脑会爆炸!!! Grails spring-security 插件开箱即用,所以我知道它必须存在。请不要让我的大脑爆炸!!!

编辑:

想通了……

您必须提供自定义org.springframework.security.intercept.web.FilterSecurityInterceptor 并提供objectDefinitionSource

<bean id="filterSecurityInterceptor" class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
    <security:custom-filter before="FILTER_SECURITY_INTERCEPTOR" />
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="accessDecisionManager" ref="accessDecisionManager" />
    <property name="objectDefinitionSource">
        <value>
            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
            PATTERN_TYPE_APACHE_ANT
            /**login.html=IS_AUTHENTICATED_ANONYMOUSLY
            /user/**=ROLE_ADMIN
        </value>
    </property>
</bean>

我想我将使用 FactoryBean:

public class RequestMappingFactoryBean implements FactoryBean {

    private final static String EOL = System.getProperty("line.separator");

    public Object getObject() throws Exception {
        StringBuffer sb = new StringBuffer();
        sb.append("CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON");
        sb.append(EOL);
        sb.append("PATTERN_TYPE_APACHE_ANT");
        sb.append(EOL);
        sb.append("/**login.html=IS_AUTHENTICATED_ANONYMOUSLY");
        sb.append(EOL);
        sb.append("/user/**=ROLE_ADMIN");
        return sb.toString();
    }

    @SuppressWarnings("unchecked")
    public Class getObjectType() {
        return String.class;
    }

    public boolean isSingleton() {
        return true;
    }

}

传递给它一个 DAO 等。

<bean id="filterSecurityInterceptor" class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
    <security:custom-filter before="FILTER_SECURITY_INTERCEPTOR" />
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="accessDecisionManager" ref="accessDecisionManager" />
    <property name="objectDefinitionSource" ref="requestMappings" />
</bean>

<bean id="requestMappings" class="RequestMappingFactoryBean" />

【问题讨论】:

标签: java spring grails spring-mvc spring-security


【解决方案1】:

你想在你的 spring xml 中使用这样的东西吗?

<!-- Settings -->
<b:bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <b:property name="locations">
        <b:value>/WEB-INF/config.properties</b:value>
    </b:property>
</b:bean>

然后在你的 Spring XML 中:

<http entry-point-ref="authenticationProcessingFilterEntryPoint">
        <intercept-url pattern='/custom/**' access="${roles.admin}"/>
</http>

【讨论】:

    【解决方案2】:

    已经有一段时间了,但是您可以创建一个 Voter 对象来帮助决定是否允许访问 URL。 Voter 对象可以从数据库或文件中加载数据,或者只是随机返回 Allow、Deny 或 Abstain。

    【讨论】:

    • 次要跟进...您部分正确。结合自定义对象def源,你必须添加一个auth voter:&lt;bean class="org.springframework.security.vote.AuthenticatedVoter" /&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多