SpringBoot集成Spring Security(一)登录注销

同个人网站 https://www.serendipper-x.cn/,欢迎访问 !

SpringBoot集成Spring Security(二)注册 、密码加密、修改密码
写在前面
Spring Security是一种基于 Spring AOP 和 Servlet 过滤器的安全框架。它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。
由于最近写的项目用到了这方面知识,这里做一些总结。下面直接看代码
一、创建项目
这里以多模块项目为例。

多模块项目优点: 帮助项目划分模块,鼓励重用,防止POM变得过于庞大,方便各个模块的构建,而不用每次都构建整个项目,使得针对某个模块的特殊控制更为方便。
在这里插入图片描述
二、引入pom依赖

<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency>

三、web层

项目最核心的代码
SecurityConfig.java

/*** @author xiao* 使用springsecurity对用户登录、注销以及权限进行控制*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate StudentService studentService;@Autowiredprivate ObjectMapper objectMapper;@BeanPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(studentService).passwordEncoder(new BCryptPasswordEncoder());}@Overrideprotected void configure(HttpSecurity http) throws Exception {http
//                .authenticationProvider(authenticationProvider()).httpBasic()//未登录时.authenticationEntryPoint((request,response,authException) -> {response.setContentType("application/json;charset=utf-8");response.setStatus(HttpServletResponse.SC_FORBIDDEN);PrintWriter out = response.getWriter();RespBean error = RespBean.error("未登录");String s = new ObjectMapper().writeValueAsString(error);out.write(s);out.flush();out.close();}).and().authorizeRequests().anyRequest().authenticated() //必须授权才能范围.and().formLogin() //使用自带的登录.usernameParameter("username").passwordParameter("password").permitAll()//登录失败,返回json.failureHandler(new AuthenticationFailureHandler() {@Overridepublic void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse resp, AuthenticationException exception) throws IOException, ServletException {resp.setContentType("application/json;charset=utf-8");resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);PrintWriter out = resp.getWriter();RespBean respBean = RespBean.error("登录失败!");if (exception instanceof UsernameNotFoundException || exception instanceof BadCredentialsException) {respBean.setMsg("用户名或者密码输入错误,请重新输入!");} else if (exception instanceof DisabledException) {respBean.setMsg("账户被禁用");} else {respBean.setMsg("未知错误");}out.write(objectMapper.writeValueAsString(respBean));out.flush();out.close();}})//登录成功,返回json.successHandler(new AuthenticationSuccessHandler() {@Overridepublic void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {resp.setContentType("application/json;charset=utf-8");PrintWriter out = resp.getWriter();Student student = (Student) authentication.getPrincipal();student.setPassword(null);RespBean ok = RespBean.ok("登录成功!", student);String s = new ObjectMapper().writeValueAsString(ok);out.write(s);out.flush();out.close();}}).and().exceptionHandling()//没有权限,返回json.accessDeniedHandler((request,response,ex) -> {response.setContentType("application/json;charset=utf-8");response.setStatus(HttpServletResponse.SC_FORBIDDEN);PrintWriter out = response.getWriter();out.write(new ObjectMapper().writeValueAsString(RespBean.error("权限不足")));out.flush();out.close();}).and().logout()//退出成功,返回json.logoutSuccessHandler(new LogoutSuccessHandler() {@Overridepublic void onLogoutSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {resp.setContentType("application/json;charset=utf-8");PrintWriter out = resp.getWriter();out.write(new ObjectMapper().writeValueAsString(RespBean.ok("注销成功!")));out.flush();out.close();}}).permitAll();//开启跨域访问http.cors().disable();//开启模拟请求,比如API POST测试工具的测试,不开启时,API POST为报403错误http.csrf().disable();}@Overridepublic void configure(WebSecurity web) {//对于在header里面增加token等类似情况,放行所有OPTIONS请求。web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");}
}

四、mapper层

mapper下的StudentMapper.java

/*** @author xiao*/
public interface StudentMapper {Student loadUserBySno(String sno);
}

resource下的StudentMapper.xml**

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.jxnu.os.mapper.StudentMapper"><resultMap id="BaseResultMap" type="com.jxnu.os.model.Student"><id column="id" property="id" jdbcType="INTEGER"/><result column="username" property="username" jdbcType="VARCHAR"/><result column="sno" property="sno" jdbcType="VARCHAR"/><result column="s_sex" property="s_sex" jdbcType="CHAR"/><result column="t_id" property="t_id" jdbcType="INTEGER"/><result column="password" property="password" jdbcType="VARCHAR"/></resultMap><select id="loadUserByUsername" resultMap="BaseResultMap">select * from student where username=#{username}</select></mapper>

五、model层

model下的Student.java
注意一定要implements UserDetails

/*** @author xiao* 学生实体类*/
public class Student implements UserDetails {
////学生主键IDprivate Integer id;//学生姓名private String username;//登录密码private String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}private Collection<? extends GrantedAuthority> authorities;public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}public void setAuthorities(Collection<? extends GrantedAuthority> authorities) {this.authorities = authorities;}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return this.authorities;}@Overridepublic String getPassword() {return this.password;}@Overridepublic String getUsername() {return this.username;}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}

六、service层
service下的StudentService.java

/*** @author xiao*/
@Service
public class StudentService implements UserDetailsService {@AutowiredStudentMapper studentMapper;/*** 登录* @param username* @return* @throws UsernameNotFoundException*/@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {Student student = studentMapper.loadUserBySno(username);if (student == null) {throw new UsernameNotFoundException("用户不存在");}return student;}
}

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

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

相关文章

什么是1+N模式的新一代城市大脑建设方案

来源&#xff1a;城市大脑全球标准研究组前言&#xff1a;2021年上半年&#xff0c;我们在城市大脑的最新探索和研究中&#xff0c;提出了1N模式的新一代城市大脑建设方案。其中“1”是世界统一标准的城市神经元网络&#xff0c;“N”是N条城市云反射弧&#xff0c;这是基于互联…

今天pycharm不能正常使用了

按照以下方法完美解决&#xff1b; https://blog.csdn.net/u014044812/article/details/78727496转载于:https://www.cnblogs.com/MichaelMeng/p/10415565.html

图计算-Pregel-Hama

一.图计算简介 1.1 图计算是专门针对图结构数据的处理&#xff0e; 许多大数据都是以大规模图或网络的形式呈现&#xff1b;许多非图结构的大数据&#xff0c;也常常被转换为图模型后进行分析&#xff1b;图结构很好地表达了数据之间的关联性&#xff1b;关联性计算是大数据计…

leetcode解题记录(二)

leetcode14&#xff1a;最长公共前缀 问题描述&#xff1a; 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例1&#xff1a; 输入: ["flower","flow","flight"] 输出: "fl" …

英伟达推出全球首个元宇宙平台,豪砸数亿是为什么?

来源&#xff1a;AI科技大本营(ID:rgznai100)编译&#xff1a;禾木木翻译&#xff1a;AI科技大本营NVIDIA 在 SIGGRAPH 推出首个全球元宇宙平台&#xff0c;并赢得了最佳展示奖。目前处于公测阶段&#xff0c;它对 NVIDIA RTX 和 GeForce RTX GPU 用户免费开放。用户在安装完 N…

长链剖分题表

长链剖分&#xff0c;类似于重链剖分(dsu on tree)的一种替代算法。最广泛的用法是优化与深度有关的树上DP&#xff0c;以及处理一些与点分治类似的问题。有一部分长链剖分题也可以用dsu on tree做&#xff0c;单复杂度往往会多一个log。 每个点找到高度最大的儿子作为自己的重…

流计算

一.概述 实时获取来自不同数据源的海量数据经过实时分析处理&#xff0c;或的有价值的信息&#xff0e; 1.数据的处理流程 静态数据:数据不会发生变化&#xff0c;如数据仓库中的数据&#xff1b;流数据:数据以大量&#xff0c;快速&#xff0e;时变的流形式持续到达&#xf…

SpringBoot集成Spring Security(二)注册 、密码加密、修改密码

SpringBoot集成Spring Security&#xff08;一&#xff09;登录注销 写在前面 上一节创建了项目并且利用Spring Security完成了登录注销功能&#xff0c;这里继续说一下注册、密码加密和找回密码&#xff0c;代码注释较清晰。 一、web层 控制 StudentController.java package …

自动驾驶需要做哪些测试?

来源&#xff1a;广电计量&#xff0c;文&#xff1a;李梓熙、王闻彦参考资料来源&#xff1a;《有问必答 | 自动驾驶汽车之道路“测试”与“考试”》by公安部交通管理科研所微发布自动驾驶已然成为汽车行业热词。在大家殷切的期盼下&#xff0c;近几年上市的车型&#xff0c;多…

雷林鹏分享:C# 多态性

C# 多态性 多态性意味着有多重形式。在面向对象编程范式中&#xff0c;多态性往往表现为"一个接口&#xff0c;多个功能"。 多态性可以是静态的或动态的。在静态多态性中&#xff0c;函数的响应是在编译时发生的。在动态多态性中&#xff0c;函数的响应是在运行时发生…

大数据的应用-UserCF和ItemCF推荐算法

一.推荐系统 1.1 推荐系统是大数据在互联网领域的典型应用&#xff0c;它可以通过分析用户的历史记录来了解用户的喜好&#xff0c;从而主动的为用户推荐其感兴趣的信息&#xff0c;满足用户的个性化推荐需求&#xff0e; 1.2 推荐系统是自动联系用户和物品的一种工具&#x…

计算机网络之Web应用

1、web与HTTP world Wide Web&#xff1a; 网页 网页互相链接 网页包含多个对象&#xff1a; 对象&#xff1a; HTML文件、JPEG图片、视频文件、动态脚本等 基本HTML文件&#xff1a; 包含对其他对象引用的链接 对象的寻址&#xff1a; URL&#xff08;Uniform Resource Locato…

UI控件Telerik UI for WinForms发布R1 2019|附下载

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件。所有的UI for WinForms控件都具有完整的主题支持&#xff0c;可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 【Telerik UI for WinForms R1 2019下载】新增&#xf…

HBase错误解决(启动Hbase出现错误的替换,启动hbase shell出现ERROR KeeperErrorCode=NoNode for /hbase/master)

&#xff11;&#xff0e;问题描述 我查阅资料发现&#xff0c;网上很多人和我出现相同的错误&#xff0c;却没有一个可以解决的教程&#xff0c;于是我在解决了我的一个错误后就立即写了这篇文章&#xff0c;需要能帮到一些人&#xff0c;文章不一定对每个人都有效&#xff0c…

如何使用jmeter进行并发登录测试

第一种方案直接从数据库中获取账号和密码 1、设置线程数为20 &#xff0c;我们的并发用户量就是20个用户同时登录 2、添加定时器 3、设置集合点&#xff0c;当用户数量达到20个的时候再同时请求进行登录操作 4、添加配置元件&#xff1a;JDBC Connection Configuration 5、添加…

云计算与分布式系统课程学习笔记(一)——云计算简介

大数据对于系统架构的需求 显式的需求 海量计算和存储快速计算 隐式的需求 数据的快速传输灵活性低成本 如何实现这些需求&#xff1f; 并行化&#xff08;并行化的理念存在于计算机方方面面&#xff09; 并行请求&#xff08;分配给多个计算机&#xff09;并行线程&…

DeepMind用神经网络求解MIP后,攻破运筹学只是时间问题?你想多了

来源&#xff1a;杉数科技作者&#xff1a;皇甫琦、葛冬冬、杉数科技COPT开发组Google的DeepMind团队最近官宣了一篇神经网络(Neural Networks)求解MIP论文。一石激起千层浪&#xff0c;在国内外的运筹优化社群引起了讨论。部分围观吃瓜群众纷纷表示&#xff1a;"This is …

计算机视觉-SIFT

一.SIFT(Scale Invariant Feature Transform) 算法 1.图像尺度空间 要让计算机能够对物体在不同尺度下有一个统一的认知&#xff0c;就要需要考虑图像在不同尺度(远近&#xff0c;大小&#xff0c;颜色区别等)下存在的特点&#xff0e;尺度空间的获取通常使用高斯模糊来实现&…

世界上最好的光刻机为什么来自荷兰?【物联网智商精选】

来源: 大数据实验室“是说芯语”已陪伴您439天现在微电子集成电路技术对世界的各种科技电子产品越来越应用广泛了&#xff0c;一个国家的发展越来越离不开高端芯片了&#xff0c;一个国家越是发展得越快对高端芯片需求量越大&#xff0c;比如我国的芯片需求占世界的50&#xff…

云计算与分布式系统课程学习笔记(二)——Linux基本命令的使用与熟悉

&#xff08;1&#xff09; jps 【显示当前系统的java进程情况&#xff0c;及其id号】 -q只显示pid&#xff0c;不显示class名称,jar文件名和传递给main方法的参数-m输出传递给main方法的参数-l输出主类的完整包名或者jar文件完整路径名-v输出传递给JVM的参数 编写一个JSPDemo…