【问题标题】:Spring Security: Allow page views for all Fully Authenticated users, unless they have a specific roleSpring Security:允许所有经过完全身份验证的用户的页面查看,除非他们具有特定角色
【发布时间】:2010-10-05 21:47:54
【问题描述】:

我正在使用带有 Spring Security 的 Spring 3.0.3。

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

所以,用起来没问题:

<security:intercept-url pattern="/**" access="isFullyAuthenticated()" requires-channel="https"/>

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

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

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

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

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

编辑 这是我的整个安全性: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>

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

【问题讨论】:

    标签: java spring-security


    【解决方案1】:

    我最终做了以下事情:

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

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

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

    如果有人知道更好的方法,请添加答案。

    【讨论】:

      【解决方案2】:

      正如你所说,我认为你只需要让你的“被拒绝”页面不需要任何安全性即可访问,所以只需为该特定页面添加一个拦截 URL...

      这个例子是使用 Spring Security 2,但它应该翻译...

      <intercept-url pattern="/denied.html" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none" />
      

      编辑:

      您可能还需要使您的 javascript、css、图像等也有类似的安全限制豁免,否则您的页面将不会加载纯文本以外的任何内容。

      【讨论】:

      • 这对我不起作用。我已经用更多细节更新了我的问题。
      • 啊,现在我想起来,它不会。您被禁止的用户仍处于登录状态(非匿名)。如果你去掉所有的安全内容,你还能通过 URL 访问 /denied 吗?
      猜你喜欢
      • 2016-02-13
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 2017-08-05
      • 2015-06-20
      • 2015-07-01
      • 2020-10-20
      相关资源
      最近更新 更多