【问题标题】:Spring Security AuthoriaztionSpring 安全授权
【发布时间】:2026-02-05 02:20:07
【问题描述】:

有一个使用 Spring 3.2 + Hibernate 4 + maven 创建的 Web 应用程序。

现在我想根据用户角色进行身份验证和授权。截至目前,我并没有专注于身份验证。假设用户是有效的,我在对象的某处有一个角色。

现在我想开始授权部分。我是新手,不知道如何进行。我在网上做了一些研发,但看起来很艰难。

我有一份文件,上面写着我需要做什么。有一些问题我想问:

  • 采用基于角色的访问控制框架来控制权限:请稍微解释一下。我认为这是在谈论基于角色的授权。

  • UI 级别权限、方法级别权限、对象级别权限:我在网上搜索,发现对象级别权限类似于创建 ACL(访问控制列表),看起来很复杂。为什么需要对象级权限。

  • 对象的动态权限评估:为什么需要它。

  • 我在网上搜索发现@PreAuthorize 和@PostAuthorize 有方法级别的权限。是否需要 Spring AOP 来执行此操作。到目前为止,我们现在在应用程序中使用 Spring AOP。 请帮助我如何开始。

【问题讨论】:

    标签: java spring jakarta-ee spring-security


    【解决方案1】:

    为了授权,你需要在 security.xml 文件中配置一些东西

    首先你需要加载你想要授权的角色

    <sec:authentication-manager alias="authenticationManager">
            <sec:authentication-provider ref="preauthAuthProvider"/>
        </sec:authentication-manager>
    
        <bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
            <property name="preAuthenticatedUserDetailsService">
                <bean id="userDetailsServiceWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
                    <property name="userDetailsService" ref="userDetailsService"/>
                </bean>
            </property>
        </bean>
    

    您需要创建一个 bean 名称 userDetailsS​​ervice 以从 DB 或任何其他来源获取所有角色。

    现在您需要通过配置角色投票者来配置决策管理器,说明您要授权哪种类型的角色

     <bean id="httpRequestAccessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
            <property name="allowIfAllAbstainDecisions" value="false"/>
            <property name="decisionVoters">
                <list>
                    <ref bean="roleVoter"/>
    

    之后您需要配置一个过滤安全拦截器,您需要在其中定义一个拦截 url,您需要在其中定义一个受保护的资源 uri 并使用您想要保护的角色进行访问

     <bean id="fsi" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
            <property name="authenticationManager" ref="authenticationManager"/>
            <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>
            <property name="securityMetadataSource">
                <sec:filter-security-metadata-source lowercase-comparisons="true">
                     <sec:intercept-url pattern='/test**' access='testRole'/>
    

    【讨论】:

    • 谢谢。你能给我一步一步的指导吗?我是新来的。
    最近更新 更多