Spring Security:允许所有经过完全身份验证的用户进行页面视图,除非他们具有特定角色

Bun*_*num 5 java spring-security

我正在使用 Spring 3.0.3 和 Spring Security。

因此,我对我正在制作的应用程序有相当宽松的限制。我只想确保一个人可以登录并通过身份验证才能查看该应用程序。我不想向此应用程序的每个潜在用户授予角色(可能有数十万)。

所以,使用它很好:

<security:intercept-url pattern="/**" access="isFullyAuthenticated()" requires-channel="https"/>
Run Code Online (Sandbox Code Playgroud)

但现在我希望能够在需要时限制人们使用该应用程序,因此我创建了一个名为 ROLE_BANNED 的角色,希望我可以将角色分配给那些有问题的人。

所以,现在我正在尝试这个:

<security:intercept-url pattern="/**" access="isFullyAuthenticated() and not hasRole('ROLE_BANNED')" requires-channel="https"/>
Run Code Online (Sandbox Code Playgroud)

起初这似乎有效,但它无法加载我的拒绝页面。我相信它限制了对被拒绝页面的访问。我无法通过控制器或 WEB-INF 中的 jsp 加载被拒绝的页面。

有人可以告诉我如何允许经过身份验证的用户访问我的所有应用程序并将具有特定角色 (ROLE_BANNED) 的人员发送到被拒绝的页面吗?

编辑 这是我的整个 security:http 设置:

<security:http auto-config="true" access-denied-page="/denied" entry-point-ref="casAuthenticationEntryPoint" use-expressions="true">
    <security:intercept-url pattern="/**" access="isFullyAuthenticated() and not hasRole('ROLE_BANNED')" requires-channel="https"/>
    <security:intercept-url pattern="/denied" access="IS_AUTHENTICATED_FULLY" filters="none" />

    <security:logout logout-url="/logout" logout-success-url="${cas.logoutUrl}" />
    <security:session-management session-fixation-protection="none" />
    <security:custom-filter after="CAS_FILTER" ref="casAuthenticationFilter"/>
    <security:custom-filter before="CHANNEL_FILTER" ref="channelProcessingFilter" />
    <security:port-mappings>
        <security:port-mapping http="80" https="443" />
    </security:port-mappings>
</security:http>
Run Code Online (Sandbox Code Playgroud)

我尝试过使用控制器映射的拒绝页面 (/denied)、jsp 页面 (/denied.jsp) 甚至简单的 html 页面 (/denied.html),但每个页面都返回 404。发生这种情况时,我在日志文件中看不到任何内容。

Bun*_*num 5

我最终做了以下事情:

<security:intercept-url pattern="/**" access="isFullyAuthenticated()" requires-channel="https"/>
<security:intercept-url pattern="/banned" access="isFullyAuthenticated() and hasRole('ROLE_BANNED')" requires-channel="https"/>
Run Code Online (Sandbox Code Playgroud)

这意味着您必须在这两种情况下登录,但您必须具有 BANNED 角色才能访问被禁止的页面。

我还添加了一个在每个控制器方法之前使用 RequestMethod.GET 运行的方面,该方面检查用户是否具有 BANNED 角色,如果是,则将其重定向到 /banned。

如果有人知道更好的方法来做到这一点,请添加答案。