基于命名空间或 URI 的 spring 安全性

Posted

技术标签:

【中文标题】基于命名空间或 URI 的 spring 安全性【英文标题】:Namespace or URI based spring security 【发布时间】:2012-07-04 14:07:11 【问题描述】:

我需要根据 URI 的命名空间来实现授权。 例如,所有类型的用户都可以访问 localhost:8080/common/*,并且 localhost:8080/admin/* 只有管理员用户才能访问。

我已经使用 UsernamePasswordAuthenticationFilter 进行登录,但我不知道如何检查每个请求的授权。

谁能指导我如何使用 Spring Security 实现这种授权?

感谢和问候。

【问题讨论】:

【参考方案1】:

您可以使用

<intercept-url> element

intercept-url 元素可用于定义一个模式,该模式使用 ant 路径样式语法与传入请求的 URL 匹配。

例如使用 SpEL 的 Spring 3.0 +:

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/common/*" access="permitAll" />
    <intercept-url pattern="/registered/*" access="hasAnyRole('ROLE_USER,ROLE_ADMIN')" />
    <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
</http>

如果您没有 SpEL 支持,请像这样使用:

<http auto-config='true'>
    <intercept-url pattern="/common/*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <intercept-url pattern="/registered/*" access="ROLE_USER,ROLE_ADMIN" />
    <intercept-url pattern="/admin/*" access="ROLE_ADMIN" />
</http>

Documentation

更新 - 如果您在 JSP/JSP 中进行转发,则需要在 http 元素上设置一次每次请求 =“false”。

另见:

Spring Security 3 and JSF 2 integration without redirecting page

【讨论】:

感谢您的回复。实际上我已经尝试过相同的代码,但是这种授权只在登录(身份验证)时发生一次,以后不会发生在每个请求中。 所以我认为您在 JSP/JSF 页面中进行转发。我已经更新了答案!

以上是关于基于命名空间或 URI 的 spring 安全性的主要内容,如果未能解决你的问题,请参考以下文章

如何使百里香弹簧安全命名空间可用?

Spring 安全 SessionRegistry 和基于 bean 的配置问题

XML - 试图掌握命名空间 URI 的概念

单独的 xslt-replace 命名空间 uri

“clr-namespace” URI 指的是程序集中未包含的命名空间

php DoomHamster Media Group的URI解析器(如果不使用命名空间,则从脚本顶部删除命名空间)