spring-security权限认证

本文详细介绍了Spring Security框架在认证授权中的应用,包括用户登录认证、角色权限授权以及相关的表结构设计。通过示例代码展示了如何配置Spring Security XML,实现登录界面、权限控制等功能。同时,针对登录页面个性化、资源匿名访问、数据库验证账号密码等问题提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、认证与授权

    认证:系统中,用户需要登录才可以正常进行功能访问,登录时就需要进行认证,确保为合法用户再进行操作;

    授权:app中的功能较多,有些账号不需要访问所有的功能。此时就需要根据账号对应的角色来进行访问不同的功能,此时就需要的时对账号进行授权访问;

2、业务表结构

    一般带认证授权的业务需要7张表来完成功能的实现。其中4张数据表,用户表t_user、权限表t_permission、角色表t_role、菜单表t_menu;3张数据表的关系表,

用户角色关系表 t_user_role、角色权限关系表 t_role_permission 、角色菜单关系表 t_role_menu。具体表关系如下:
 
3、入门demo
    3.1 依赖包
<dependency>
    <groupId> org.springframework.security </groupId>
    <artifactId> spring‐security‐web </artifactId>
    <version> 5.0.5.RELEASE </version>
</dependency>
<dependency>
    <groupId> org.springframework.security </groupId>
    <artifactId> spring‐security‐config </artifactId>
    <version> 5.0.5.RELEASE </version>
</dependency>

    3.2 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 加载spring容器 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext.xml;classpath:spring-security.xml</param-value>
    </context-param>
    
    <filter>
        <!--DelegatingFilterProxy用于整合第三方框架 整合Spring Security时过滤器的名称必须为springSecurityFilterChain,
        否则会抛出NoSuchBeanDefinitionException异常 -->
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

</web-app>

   3.3 spring-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security.xsd
">

    <!--http:用于定义相关权限控制
            auto‐config:是否自动配置 设置为true时框架会提供默认的一些配置,例如提供默认的登 录页面、登出处理等
                                设置为false时需要显示提供登录表单配置,否则会报错
            use‐expressions:用于指定intercept‐url中的access属性是否使用表达式,true使用
    -->
    <security:http auto-config="true" use-expressions="true">
        <!--intercept‐url:定义一个拦截规则
                pattern:对哪些url进行权限控制。/**代表所有权限
                access:在请求对应的URL时需要什么权限,默认配置时它应该是一个以逗号分隔的角色列表,请求的用户只需拥有其中的一个角色就能成功访问对应的URL
        -->
        <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"/>
    </security:http>
    <!-- authentication‐manager:认证管理器,用于处理认证操作 -->
    <security:authentication-manager>
        <!-- authentication‐provider:认证提供者,执行具体的认证逻辑 -->
        <security:authentication-provider>
            <!-- user‐service:用于获取用户信息,提供给authentication‐provider进行认证 -->
            <security:user-service>
                <!--
                user:定义用户信息,可以指定用户名、密码、角色,后期可以改为从数据库查询用户信息
                    {noop}:表示当前使用的密码为明文
               -->
                <security:user name="admin" password="{noop}Admin" authorities="ROLE_ADMIN"/>
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>

</beans>

 4、验证

    4.1 启动tomcat,访问工程页面,自动跳转至 http://localhost:85/login 页面;该页面为security提供的默认登录界面

    4.2 输入账号密码,登录成功,访问业务index.html页面

    4.3 遗留问题:

        4.3.1 业务所有的资源都被保护,但实际上一些css,js等文件不需要保护,匿名也可以进行访问,

        4.3.2 登录界面为默认的,业务需要个性化登录页面,

        4.3.3 登录账号密码实际应该从数据库读取,

        4.3.4 密码需要加密处理而非明文记录;

5、问题解决

    5.1 配置可匿名访问的资源

    <!-- 配置可匿名访问的资源 -->
    <security:http security="none" pattern="/page/a.html"/>
    <security:http security="none" pattern="/page/b.html"/>
    <security:http security="none" pattern="/js/**"/>

    5.2 使用个性化登录页面

<!-- 首先必须配置自定义登录页面可以匿名访问 -->
<security:http security="none" pattern="/login.html" />

        <!-- 定义表单登录信息
            login-page:默认的登录界面;
            username-parameter:登录页面自定义form表单账号的提交参数名
            password-parameter:登录页面自定义form表单密码的提交参数名
            login-processing-url: 登录请求拦截的url,也就是自定义form表单提交时指定的action
            default-target-url:默认的登录成功显示页面
            authentication-failure-url:登录失败后跳转的页面
        -->
        <security:form-login
                login-page="/login.html"
                username-parameter="username"
                password-parameter="password"
                login-processing-url="/login.do"
                default-target-url="/index.html"
                authentication-failure-url="/login.html"/>

<!--csrf:对应CsrfFilter过滤器 disabled:是否启用CsrfFilter过滤器,如果使用自定义登录页面需要关闭此项,否则 登录操作会被禁用(403) --> 
<security:csrf disabled="true"></security:csrf>

 5.3 实现数据库读取验证账号密码

        5.3.1 实现spring security框架提供的一个UserDetailsService接口,重新接口的loadUserByUsername()方法,最终返回一个UserDetails(携带账号,密码,权限)的对象;

        5.3.2 在spring-security.xml中对实现的类进行对象声明;

        5.3.3 在spring-security.xml中对认证提供者进行修改

<security:authentication-provider user-service-ref="userService">
</security:authentication-provider>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值