You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security 2.0.2升级至3.2.9配置问题求助

Spring Security 2.0.2升级到3.2.9配置问题排查

我将Spring Security从2.0.2版本升级至3.2.9版本后,更新了security-sso-beans.xml配置,但出现访问拒绝错误以及Bean创建的JSON错误,配置代码如下:

<sec:http pattern="/webcontent/**" security="none"/>
<sec:http pattern="/redirect.jsp" security="none"/>
       
<sec:http entry-point-ref="entryPoint" use-expressions="true" auto-config="true">
           <sec:access-denied-handler error-page="/denied.atps"/>
           <sec:intercept-url pattern="/home.atps" access="hasRole('ROLE_SUBMITTER,ROLE_FINANCE_DIRECTOR,ROLE_INVOICE_POINT_APPROVER,ROLE_REGIONAL_DIRECTOR,ROLE_TP_REVIEWER,ROLE_INVOICE_POINT,ROLE_TECH_OPS,ROLE_MARKET, ROLE_ADMIN, ROLE_CAA,ROLE_OPEL_APPROVER')"/>
           <sec:intercept-url pattern="/myrole.atps" access="hasRole('ROLE_SUBMITTER,ROLE_FINANCE_DIRECTOR,ROLE_INVOICE_POINT_APPROVER,ROLE_REGIONAL_DIRECTOR,ROLE_TP_REVIEWER,ROLE_INVOICE_POINT,ROLE_TECH_OPS,ROLE_MARKET,ROLE_OPEL_APPROVER')" />
           <sec:intercept-url pattern="/f1/*.atps" access="hasRole('ROLE_SUBMITTER,ROLE_FINANCE_DIRECTOR,ROLE_INVOICE_POINT_APPROVER,ROLE_REGIONAL_DIRECTOR,ROLE_TP_REVIEWER,ROLE_ADMIN, ROLE_CAA,ROLE_OPEL_APPROVER')" />
           <sec:intercept-url pattern="/grid.atps" access="hasRole('ROLE_SUBMITTER,ROLE_FINANCE_DIRECTOR,ROLE_INVOICE_POINT_APPROVER,ROLE_REGIONAL_DIRECTOR,ROLE_TP_REVIEWER,ROLE_INVOICE_POINT,ROLE_TECH_OPS,ROLE_MARKET,ROLE_OPEL_APPROVER')" />
           <sec:intercept-url pattern="/admin.atps" access="hasRole('ROLE_ADMIN, ROLE_CAA')" />
           <sec:intercept-url pattern="/adminGrid/*.atps" access="hasRole('ROLE_ADMIN, ROLE_CAA')" />
           <sec:intercept-url pattern="/form/handledraft.atps" access="hasRole('ROLE_SUBMITTER,ROLE_TP_REVIEWER')" />
           <sec:intercept-url pattern="/form/handleTPRequest.atps" access="hasRole('ROLE_SUBMITTER,ROLE_TP_REVIEWER')" />
           <sec:intercept-url pattern="/form/handleDistributorRequest.atps" access="hasRole('ROLE_SUBMITTER,ROLE_TP_REVIEWER')" />
           <sec:intercept-url pattern="/userreport.atps" access="hasRole('ROLE_ADMIN, ROLE_CAA')" />
           <sec:intercept-url pattern="/caa.atps" access="hasRole('ROLE_CAA')" />
           <sec:custom-filter position="PRE_AUTH_FILTER" ref="authFilter" />
           <sec:session-management>
               <sec:concurrency-control max-sessions="1"/>
           </sec:session-management>
           <sec:logout/>
</sec:http>

配置中的核心问题及修正方案

1. hasRole表达式语法错误(直接导致访问拒绝+Bean解析错误)

Spring Security 3.x中,hasRole()方法仅支持单个角色参数,多角色场景必须使用hasAnyRole()方法,且每个角色需单独用引号分隔。当前写法将多个角色塞进一个hasRole()参数中,会触发SpEL表达式解析失败,进而引发Bean创建异常,同时权限判断逻辑失效导致访问拒绝。

错误示例:

<sec:intercept-url pattern="/home.atps" access="hasRole('ROLE_SUBMITTER,ROLE_FINANCE_DIRECTOR,...')"/>

修正后:

<sec:intercept-url pattern="/home.atps" access="hasAnyRole('ROLE_SUBMITTER','ROLE_FINANCE_DIRECTOR','ROLE_INVOICE_POINT_APPROVER','ROLE_REGIONAL_DIRECTOR','ROLE_TP_REVIEWER','ROLE_INVOICE_POINT','ROLE_TECH_OPS','ROLE_MARKET','ROLE_ADMIN','ROLE_CAA','ROLE_OPEL_APPROVER')"/>

所有包含多角色的hasRole都需替换为hasAnyRole,并拆分每个角色参数。

2. auto-config="true"与自定义预认证过滤器冲突

启用auto-config="true"会自动配置Spring Security默认过滤器链(如表单登录、Basic认证等),但同时自定义PRE_AUTH_FILTER会导致过滤器链顺序混乱或重复配置,引发Bean创建异常。

如果是SSO预认证场景,建议关闭auto-config,手动配置必要组件:

<sec:http entry-point-ref="entryPoint" use-expressions="true" auto-config="false">

3. 可选优化:Session并发控制完整性

Spring Security 3.2中,concurrency-control未指定session-registry-ref时会自动创建默认SessionRegistry,但显式配置可提升会话管理的稳定性:

<sec:session-management>
    <sec:concurrency-control max-sessions="1" session-registry-ref="sessionRegistry"/>
</sec:session-management>

<!-- 显式声明SessionRegistry Bean -->
<bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/>

修正后的完整配置示例

<sec:http pattern="/webcontent/**" security="none"/>
<sec:http pattern="/redirect.jsp" security="none"/>
       
<sec:http entry-point-ref="entryPoint" use-expressions="true" auto-config="false">
    <sec:access-denied-handler error-page="/denied.atps"/>
    <sec:intercept-url pattern="/home.atps" access="hasAnyRole('ROLE_SUBMITTER','ROLE_FINANCE_DIRECTOR','ROLE_INVOICE_POINT_APPROVER','ROLE_REGIONAL_DIRECTOR','ROLE_TP_REVIEWER','ROLE_INVOICE_POINT','ROLE_TECH_OPS','ROLE_MARKET','ROLE_ADMIN','ROLE_CAA','ROLE_OPEL_APPROVER')"/>
    <sec:intercept-url pattern="/myrole.atps" access="hasAnyRole('ROLE_SUBMITTER','ROLE_FINANCE_DIRECTOR','ROLE_INVOICE_POINT_APPROVER','ROLE_REGIONAL_DIRECTOR','ROLE_TP_REVIEWER','ROLE_INVOICE_POINT','ROLE_TECH_OPS','ROLE_MARKET','ROLE_OPEL_APPROVER')" />
    <sec:intercept-url pattern="/f1/*.atps" access="hasAnyRole('ROLE_SUBMITTER','ROLE_FINANCE_DIRECTOR','ROLE_INVOICE_POINT_APPROVER','ROLE_REGIONAL_DIRECTOR','ROLE_TP_REVIEWER','ROLE_ADMIN','ROLE_CAA','ROLE_OPEL_APPROVER')" />
    <sec:intercept-url pattern="/grid.atps" access="hasAnyRole('ROLE_SUBMITTER','ROLE_FINANCE_DIRECTOR','ROLE_INVOICE_POINT_APPROVER','ROLE_REGIONAL_DIRECTOR','ROLE_TP_REVIEWER','ROLE_INVOICE_POINT','ROLE_TECH_OPS','ROLE_MARKET','ROLE_OPEL_APPROVER')" />
    <sec:intercept-url pattern="/admin.atps" access="hasAnyRole('ROLE_ADMIN','ROLE_CAA')" />
    <sec:intercept-url pattern="/adminGrid/*.atps" access="hasAnyRole('ROLE_ADMIN','ROLE_CAA')" />
    <sec:intercept-url pattern="/form/handledraft.atps" access="hasAnyRole('ROLE_SUBMITTER','ROLE_TP_REVIEWER')" />
    <sec:intercept-url pattern="/form/handleTPRequest.atps" access="hasAnyRole('ROLE_SUBMITTER','ROLE_TP_REVIEWER')" />
    <sec:intercept-url pattern="/form/handleDistributorRequest.atps" access="hasAnyRole('ROLE_SUBMITTER','ROLE_TP_REVIEWER')" />
    <sec:intercept-url pattern="/userreport.atps" access="hasAnyRole('ROLE_ADMIN','ROLE_CAA')" />
    <sec:intercept-url pattern="/caa.atps" access="hasRole('ROLE_CAA')" />
    <sec:custom-filter position="PRE_AUTH_FILTER" ref="authFilter" />
    <sec:session-management>
        <sec:concurrency-control max-sessions="1" session-registry-ref="sessionRegistry"/>
    </sec:session-management>
    <sec:logout/>
</sec:http>

<bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/>

内容的提问来源于stack exchange,提问作者user2859273

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:25:04