Spring整合SpringSecurity

SpringSecurity基础使用

SpringSecurity是一个安全框架,主要功能是认证授权

从Spring入手SpringSecurity

1. Spring整合SpringSecurity

applicationContext.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:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:component-scan base-package="com.shaoby.service"></context:component-scan><import resource="spring-security.xml"/>
</beans>
spring-mvc.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:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 启用注解扫描 --><context:component-scan base-package="com.shaoby.controller" /><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/" /><property name="suffix" value=".jsp" /></bean><!-- 启用Spring MVC的注解 --><mvc:annotation-driven /><!-- 定义控制器 -->
<!--    <bean name="/example" class="com.shaoby.controller.ExampleController" />--></beans>
spring-security.xml
<beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd"><http auto-config="true"><intercept-url pattern="/login.jsp" access="permitAll()"/><intercept-url pattern="/**" access="hasAnyRole('ROLE_USER')" /><form-login login-page="/login.jsp" login-processing-url="/login" authentication-success-forward-url="/home.jsp"/><remember-metoken-validity-seconds="60"remember-me-parameter="remember-me"/><access-denied-handler error-page="/error.jsp"/></http><authentication-manager><authentication-provider><user-service><user name="user" password="{noop}123" authorities="ROLE_USER" /></user-service></authentication-provider></authentication-manager></beans:beans>
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/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><display-name>Archetype Created Web Application</display-name>
<!--  初始化web容器--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!--配置Spring的监听器,默认只加载WEB-INF目录下的applicationContext.xml配置文件--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
<!--乱码--><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
<!--security--><filter><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>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

2. 认证操作

2.1 自定义登录页面

自定义登录页面只需要在security配置文件中指定登录页面即可

<beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd"><http auto-config="true"><intercept-url pattern="/login.jsp" access="permitAll()"/><intercept-url pattern="/**" access="hasAnyRole('ROLE_USER')" /><!--指定登录页面或登录成功页面等,都在这个标签中可以指定--><form-login login-page="/login.jsp" login-processing-url="/login" authentication-success-forward-url="/home.jsp"/><!-- 错误页面--><access-denied-handler error-page="/error.jsp"/></http><authentication-manager><authentication-provider><user-service><user name="user" password="{noop}123" authorities="ROLE_USER" /></user-service></authentication-provider></authentication-manager>
</beans:beans>
2.2 关闭CSRF认证

使用csrf标签指定disabled = 'true’即可

<beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd"><http auto-config="true"><intercept-url pattern="/login.jsp" access="permitAll()"/><intercept-url pattern="/**" access="hasAnyRole('ROLE_USER')" /><!--指定登录页面或登录成功页面等,都在这个标签中可以指定--><form-login login-page="/login.jsp" login-processing-url="/login" authentication-success-forward-url="/home.jsp"/><!-- 错误页面--><access-denied-handler error-page="/error.jsp"/><!--关闭CSRF认证--><csrf disabled="true"/></http><authentication-manager><authentication-provider><user-service><user name="user" password="{noop}123" authorities="ROLE_USER" /></user-service></authentication-provider></authentication-manager>
</beans:beans>

如果在JSP页面中也可以通过引入标签解决

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-#引入
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
<html>
<head><title>登录</title>
</head>
<body>
<h1>登录页面</h1>
<form action="/login" method="post">账号:<input type="text" name="username"/> <br>密码:<input type="password" name="password"/> <br>-#使用标签<security:csrfInput/><input type="submit" value="登录">
</form>
</body>
</html>
2.3 持久层认证
  1. 认证一般是通过持久层查询进行认证的,这里暂时没有链接数据库,将数据写死。
  2. ecurity实现持久层的认证只需要实现UserDetailsService,重写loadUserByUserName,返回一个UserDetails对象即可,这个UserDetails对象可以通过任何方式获得,一般是数据库根据登录用户名查询。
  3. 需要注意的是,如果密码没有采用加密方式,密码前必须拼接{noop}字符串。
  4. 将写好的实现类给Security指定
@Service
public class UserServiceImpl implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {List<GrantedAuthority> list = new ArrayList<>();list.add(new SimpleGrantedAuthority("ROLE_USER"));UserDetails user = new User("admin", "{noop}123456", list);return user;}
}
<beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd"><http auto-config="true"><intercept-url pattern="/login.jsp" access="permitAll()"/><intercept-url pattern="/**" access="hasAnyRole('ROLE_USER')" /><!--指定登录页面或登录成功页面等,都在这个标签中可以指定--><form-login login-page="/login.jsp" login-processing-url="/login" authentication-success-forward-url="/home.jsp"/><!-- 错误页面--><access-denied-handler error-page="/error.jsp"/><!--关闭CSRF认证--><csrf disabled="true"/></http><authentication-manager><!--指定认证的类--><authentication-provider user-service-ref="userServiceImpl"></authentication-provider></authentication-manager>
</beans:beans>
2.4 密码加密
  1. 密码加密的方式有很多,比如MD5、MD4、BCryptPasswordEncoder等
  2. 如果使用加密的方式,一般是在持久层存储的就是加密后的数据
  3. 使用加密的方法
  4. 将加密的方式注入到spring容器中
  5. 然后给Security指定加密方式
<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:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:component-scan base-package="com.shaoby.service"></context:component-scan>
<!--使用的加密方式的类--><bean name="bCryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/><import resource="spring-security.xml"/>
</beans>
<beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd"><http auto-config="true"><intercept-url pattern="/login.jsp" access="permitAll()"/><intercept-url pattern="/**" access="hasAnyRole('ROLE_USER')" /><!--指定登录页面或登录成功页面等,都在这个标签中可以指定--><form-login login-page="/login.jsp" login-processing-url="/login" authentication-success-forward-url="/home.jsp"/><!-- 错误页面--><access-denied-handler error-page="/error.jsp"/><!--关闭CSRF认证--><csrf disabled="true"/></http><authentication-manager><!--指定认证的类--><authentication-provider user-service-ref="userServiceImpl"><!--给security指定加密的方式--><password-encoder ref="bCryptPasswordEncoder"/></authentication-provider></authentication-manager>
</beans:beans>
2.5 remember me
  1. 这个功能是在页面勾选’记住我‘的勾选框后,下次再次访问页面不需要再次登录
  2. 实现的原理是,在登录成功后回返回给前端一个token,并存放在一张持久层表中或则内存中,前端存放在Cookie中,下次登录只要携带Cookie,security就直接通过存储的token比对,不需要重新认证
  3. 如果指定了数据源,就存放在持久层,如果没有指定则存放在内存中
  4. token的过期时间是可以设置的
  5. 实现步骤:
  6. 开启记住我功能
  7. 如果指定数据源则存放在数据库中,如果没有指定则存放在内存中
  8. 页面请求时候要传入一个参数
<beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd"><http auto-config="true"><intercept-url pattern="/login.jsp" access="permitAll()"/><intercept-url pattern="/**" access="hasAnyRole('ROLE_USER')" /><!--指定登录页面或登录成功页面等,都在这个标签中可以指定--><form-login login-page="/login.jsp" login-processing-url="/login" authentication-success-forward-url="/home.jsp"/><!-- 错误页面--><access-denied-handler error-page="/error.jsp"/><!--关闭CSRF认证--><csrf disabled="true"/><!--开启remember功能 token-validity-seconds表示过期时间,单位秒;remember-me-parameter="remember-me"表示传入的参数名;data-source-ref="dataSource"表示指定的数据源--><remember-metoken-validity-seconds="60"remember-me-parameter="remember-me"data-source-ref="dataSource"/></http><authentication-manager><!--指定认证的类--><authentication-provider user-service-ref="userServiceImpl"><!--给security指定加密的方式--><password-encoder ref="bCryptPasswordEncoder"/></authentication-provider></authentication-manager>
</beans:beans>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型幻觉问题知识点总结

大模型幻觉问题知识点总结 定义&#xff1a; 大模型幻觉问题是指在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;基于大规模预训练模型&#xff08;如GPT-3、BERT等&#xff09;生成的文本看似合理且连贯&#xff0c;但实际上包含错误、不准确或虚假的信息。这种现象…

Aigtek高压放大器指标有哪些要求和标准

高压放大器是一类关键的电子设备&#xff0c;用于放大电信号并提供强大的输出。在不同的应用领域&#xff0c;高压放大器可能有不同的要求和标准。以下是一些常见的高压放大器指标要求和标准&#xff0c;以确保其性能和可靠性&#xff1a; 1.幅度增益和频率响应 高压放大器的主…

人大金仓携手中国一汽引领国产数据库行业新浪潮

在国产化政策的推动下,人大金仓携手中国一汽联合开发更贴近汽车产业特定需求的数据库功能和组件。从2023年2月至今,人大金仓已累计部署690套数据库,适配应用系统170个,支撑中国一汽20多个核心系统和重要系统。目前,中国一汽在国内企业数据库国产化替换率遥遥领先。此次合作为国…

猫咪健康新选择!福派斯鲜肉猫粮里的果蔬纤维大揭秘

你们是不是对福派斯鲜肉猫粮中那些丰富的果蔬粗纤维特别好奇呢&#xff1f;&#x1f914; 其实&#xff0c;这些看似简单的粗纤维&#xff0c;对猫咪的健康可是大有裨益的&#xff01; 粗纤维在猫粮中起到多种重要作用&#xff0c;并且对猫咪的健康和消化系统有着显著的影响。以…

热门开源项目推荐:探索开源世界的精彩

热门开源项目推荐 随着开源程序的发展&#xff0c;越来越多的程序员开始关注并加入开源大模型的行列。开源不仅为个人学习和成长提供了绝佳的平台&#xff0c;也为整个技术社区带来了创新和进步。无论你是初学者还是经验丰富的开发者&#xff0c;参与开源项目都能让你受益匪浅…

乡村振兴指数与其30个原始变量数据(Shp/Dta/Excel格式,2000-2022年)

数据简介&#xff1a;这份数据是我国各地级市乡村振兴指数与其30各原始变量数据并对其进行地图可视化表达。城镇化是当今中国社会经济发展的必由之路。当前我国城镇化处于发展的关键时期&#xff0c;但城镇化发展的加快却是一把双刃剑&#xff0c;为何要如此形容呢?因为当前城…

职升网:一级注册计量师就业方向如何?

首先我们要知道&#xff0c;一级注册计量师可以聘为工程师&#xff0c;可以负责计量基准和标准的量值传递工作。它可以从事一下7个方面的工作&#xff1a; 1.负责制定计量管理制度、工作计划、并组织实施&#xff1b; 2.建设期参与设计工程等计量方面的工作&#xff0c;编制计…

k8s-第十二节-DaemonSet

DaemonSet是什么? DaemonSet 是一个确保全部或者某些节点上必须运行一个 Pod的工作负载资源(守护进程),当有node(节点)加入集群时, 也会为他们新增一个 Pod。 下面是常用的使用案例: 可以用来部署以下进程的pod 集群守护进程,如Kured、node-problem-detector日志收集…

红黑树模拟实现

目录 概念 性质 节点定义 红黑树的插入 完整代码 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条…

充电桩开源平台,开发流程有图有工具

慧哥充电桩开源平台产品研发流程是确保产品从概念阶段到市场推广阶段的有序进行的关键。以下是对您给出的步骤的详细解释和建议&#xff1a; 设计业务流程: 在这一步&#xff0c;团队需要确定产品的核心功能、目标用户以及如何满足用户需求。进行市场调研&#xff0c;了解竞争…

PostMan Error:Maximum response size reached

一、问题描述 用postman本地测试&#xff0c;restful api接口导出文件&#xff0c;文件大小为190M&#xff0c;服务没问题&#xff0c;总是在导出时&#xff0c;抛出&#xff1a;Error:Maximum response size reached。开始以为是服务相应文件过大或者相应时间超时导致的。其实…

ts和js的关系

https://www.typescriptlang.org/zh/docs/handbook/typescript-from-scratch.html TypeScript&#xff08;TS&#xff09;和 JavaScript&#xff08;JS&#xff09;都是用于开发前端和后端应用的编程语言&#xff0c;但它们有一些显著的区别。以下是主要的区别&#xff1a; 1…

双向链表 -- 详细理解和实现

欢迎光顾我的homepage 前言 双向链表是一种带头双向循环的链表。在双向链表中&#xff0c;首先存在着一个头结点&#xff1b;其次每个节点有指向下一个节点的指针next 和指向上一个节点的指针prev &#xff1b…

Trimble realworks 2024.02 中文激活版获取License下载软件

Trimble realworks 2024 是领先的3D点云和2D图像处理解决方案&#xff0c;使用可您提供了一组用于处理的工具&#xff0c;以便为您的应用程序&#xff08;或项目&#xff09;获取必要的信息。此处理可以分为三种模式&#xff0c;在注册中&#xff0c;您可以注册相对于其他扫描和…

通信协议_Modbus协议简介

概念介绍 Modbus协议&#xff1a;一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气Schneider Electric&#xff09;于1979年为使用可编程逻辑控制器&#xff08;PLC&#xff09;通信而发表。Modbus已经成为工业领域通信协议的业界标准&#xff08;De f…

大舍传媒:如何在海外新闻媒体发稿报道摩洛哥?

引言 作为媒体行业的专家&#xff0c;我将分享一些关于在海外新闻媒体发稿报道摩洛哥的干货教程。本教程将带您深入了解三个重要的新闻媒体平台&#xff1a;Mediterranean News、Morocco News和North African News。 地中海Mediterranean News Mediterranean News是一个知名…

合合信息大模型“加速器”重磅上线

大模型技术的发展和应用&#xff0c;预示着更加智能化、个性化未来的到来。如果将大模型比喻为正在疾驰的科技列车&#xff0c;语料便是珍贵的“燃料”。本次世界人工智能大会期间&#xff0c;合合信息为大模型打造的“加速器”解决方案备受关注。 在大模型训练的上游阶段&…

【计算机毕业设计】021基于weixin小程序微信点餐

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Python学习中使用循环(for, while)

在Python编程语言中&#xff0c;循环是一个非常重要的概念&#xff0c;可以帮助我们在代码中重复执行某些操作。Python支持两种主要的循环结构&#xff1a;for 循环和 while 循环。 1. for 循环 for 循环用于遍历一个序列&#xff08;如列表、元组、字符串&#xff09;或其他…

第11章:标准化和软件知识产权

第11章&#xff1a;标准化和软件知识产权 标准化 国际标准(International Standard)是指国际标准化组织(ISO)、国际电工 委员会(IEC)所制定的标准。 标准 是对重复性事物和概念所做的统一规定。 标准化的特征包括横向综合性、政策性和统一性 。 标准化是指在经济、技术、科学…