【问题标题】:Spring mvc and security role based restriction issueSpring mvc 和基于安全角色的限制问题
【发布时间】:2015-01-11 19:52:45
【问题描述】:

我正在使用 spring-mvc 3.1.1.RELEASE 和 Spring-Security 构建一个应用程序,我希望每个人都必须登录才能访问它,我还想通过角色限制对某些用户的访问,我编辑了spring-security.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:sec="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.1.xsd">

<bean id="userDetailsService" class="it.dedagroup.cartesio.security.auth.UserDetailServiceImpl">
    <property name="accountService" ref="accountService"></property>
</bean>

<sec:http auto-config="true" use-expressions="true" create-session="always">
    <sec:http-basic />
    <sec:intercept-url pattern="/login" access="permitAll"/>
    <sec:intercept-url pattern="/failedLogin"  access="permitAll"/>
    <sec:intercept-url pattern="/resources/**" access="permitAll"/>
    <sec:intercept-url pattern="/error"  access="permitAll"/>
    <sec:intercept-url pattern="/accessDenied*" access="isAuthenticated()" />
    <sec:intercept-url pattern="/home*" access="isAuthenticated()" />
    <sec:intercept-url pattern="/utentiRicerca*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/userEdit*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/creaUser*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/detailsUtente*" access="isAuthenticated()" />
    <sec:intercept-url pattern="/modificaAccount*" access="isAuthenticated()" />
    <sec:intercept-url pattern="/serverRicerca*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/editServer*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/prepareListaSearch*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/prepareListaEdit*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/groupInitSearch*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/groupEdit*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/listaUpdate*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/upload*" access="isAuthenticated()" />
    <sec:intercept-url pattern="/emailRicerca*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/prepareEditCasella*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/acl*" access="hasRole('ROLE_ADMIN')" />
    <sec:intercept-url pattern="/initDaemons*" access="hasAnyRole('ROLE_ADMIN','ROLE_SYSTEM')" />
    <sec:intercept-url pattern="/mailbox*" access="hasAnyRole('ROLE_OPER','ROLE_USER')" />
    <sec:intercept-url pattern="/emailBody*" access="hasAnyRole('ROLE_OPER','ROLE_USER')" />
    <sec:intercept-url pattern="/pecBody*" access="hasAnyRole('ROLE_OPER','ROLE_USER')" />
    <sec:intercept-url pattern="/composeEmail*" access="hasRole('ROLE_OPER')" />

    <sec:form-login  login-page="/login"
        always-use-default-target="true"
        default-target-url="/home"
        authentication-failure-url="/failedLogin" />

    <sec:logout invalidate-session="true" logout-success-url="/logout" delete-cookies="true" />

    <sec:session-management invalid-session-url="/login" session-authentication-error-url="/failedLogin?sessionExpiredDuplicateLogin=true" >
        <sec:concurrency-control max-sessions="1" expired-url="/failedLogin" error-if-maximum-exceeded="false" />
    </sec:session-management>
</sec:http>

<sec:authentication-manager>
    <sec:authentication-provider user-service-ref="userDetailsService">
        <sec:password-encoder ref="stdEncoder"></sec:password-encoder>
    </sec:authentication-provider>
</sec:authentication-manager>

但是如果我删除了根 url 的安全性映射,它会返回一个找不到页面的错误,如果我以这种方式在安全性方面享有盛誉:

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

当我直接在浏览器栏上写它时,它会包装我登录后的所有请求并忽略我为子 url 指定的规则。

例如,我需要只有“ROLE_ADMIN”才能访问 url“/utentiRicerca”上的用户搜索,但如果我使用“ROLE_USER”登录并在浏览器 url“http://myhost.it:8080/myApp/utentiRicerca”上写,它不会给我“http 403”是我应得的这个角色。那我能做些什么呢?

【问题讨论】:

  • 确保带有/** 的mappnig 是链中的最后一个。它们按照指定的顺序进行查询,因此如果/** 是第一个,则其余部分未使用。使用第一个匹配模式。

标签: java spring spring-mvc spring-security


【解决方案1】:

/** 模式将匹配任何 url,因此始终可以访问所有链接。如果你把它放在最前面,其他链接甚至不会被检查,如果你把它放在最后,其他模式会被检查,但即使它们失败,当这个被检查时,用户无论如何都会通过安全性。

如果您想限制某些 url,您可以尝试更改您的 url 结构,例如,在“安全”url 下设置任何为角色访问安全的 url

例如,您可以使用以下带有“安全”前缀的链接: :

secured/prepareListaEdit

并用这样的模式保护它们:

<sec:intercept-url pattern="secured/prepareListaEdit/* access="hasRole('ROLE_ADMIN')" />

然后添加一个模式,而不是 /** 使用 /* 来访问根路径上的其他链接

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

(因为使用 /** 将匹配所有子路径,包括“安全”)

【讨论】:

  • 感谢您的回复,我终于设置了拦截器,现在可以使用了。
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 2015-10-28
  • 2017-04-04
  • 2014-11-04
相关资源
最近更新 更多