0

我有以下情况

/drug 下的所有内容都是安全的我不希望用户能够查看 /drug 下的任何内容,所以我在我的 spring 安全配置中有这个规则。

<intercept-url pattern="/drug/**" access="hasRole('ROLE_DRUG')" />

但是当用户点击/drug时,我希望能够显示拒绝访问页面,其中包含有关他们如何购买此部分或模块的消息,并且我必须在相同的 url 下显示拒绝访问消息,即 /drug/access-denied

所以我在spring security config中添加了另一个规则

<intercept-url pattern="/drug/access-denied" access="isAuthenticated()"/>

但是 spring security 似乎只考虑其中一个是第一个,改变顺序没有任何区别。并且 url 必须是 /drug/access-denied

有任何想法吗???


re.match仅匹配字符串的开头。re.search匹配任何地方。根据文档,不要只是.*在 re.match 的开头添加一个,re.search用于获得优化!(re.search在 c 中进行快速循环以仅检查与第一个字符匹配的字符串部分。如果它以不明确的字符开头,则必须一直到字符串的末尾并回溯。)

这是对 Python 的大多数正则表达式功能的更温和且(我认为)通常更好的介绍

4

2 回答 2

0

请参阅下面的配置并尝试在您的配置中进行类似的操作。首先我不明白你为什么写

<intercept-url pattern="/drug/access-denied" access="isAuthenticated()"/>

拒绝访问页面中的内容是您只希望经过身份验证的用户查看该页面。

使用您的配置,当它发现当时显示拒绝访问页面时,您将其称为 isAuthenticated() 然后再次如果用户未登录并直接尝试访问该页面,它将将用户发送到登录页面而不是访问拒绝页面.

我觉得应该是

<intercept-url pattern="/drug/access-denied" access="permitAll"/>

然后写,

<intercept-url pattern="/drug/**" access="hasRole('ROLE_DRUG')" />

见下文

<security:form-login  login-page="/login.jsp"
    default-target-url="/drug/home"  authentication-failure-handler-ref="authenticationFailureHandler" />

<security:intercept-url pattern="/login.jsp"
    access="permitAll" />


<security:intercept-url pattern="/accessDenied.jsp"
    access="permitAll" />


    <security:intercept-url pattern="/drug/*"
        access="isAuthenticated()" />


    <security:logout logout-url="/j_spring_security_logout" logout-success-url="/login.jsp?logout=success" 
        invalidate-session="true"  />

</security:http>
于 2013-08-15T09:54:03.523 回答
0

在拦截 URL 标记之前将其添加到您的配置中怎么样?

<access-denied-handler error-page="/drug/access-denied" />

然后,您可以删除“拒绝访问”的拦截 url 规则

于 2014-09-09T07:34:47.777 回答