spring security实现登录验证以及根据用户身份跳转不同页面
想关依赖,采用session加redis存储用户信息
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency><groupId>com.ibeetl</groupId><artifactId>beetl-framework-starter</artifactId><version>1.1.56.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api -->
<dependency><groupId>javax.persistence</groupId><artifactId>javax.persistence-api</artifactId><version>2.2</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
<!--session start-->
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId><version>RELEASE</version>
</dependency>
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>5.0.4.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.0.8.RELEASE</version>
</dependency>
<!--end--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>mockwebserver</artifactId><version>3.11.0</version>
</dependency><dependency><!--自动生成getter,setter--><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>RELEASE</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>RELEASE</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version>
</dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.0.3</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.0.3</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.0.3</version>
</dependency>
<!--end-->
登录处理类将用户信息存入spring security(此类是通过username获取用户的合法用户名,密码,权限,并建立合法用户,
spring security将自动与用户输入的进行匹配)
@Service
@Transactional
public class UserDetailsServiceIm implements UserDetailsService {private member memb,memRoles;@Autowiredprivate MemberEn mem;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {System.out.println("Running:\tUserDetails loadUserByUsername");memb=mem.getMember(username);if (memb == null){throw new UsernameNotFoundException("user not found");//抛出异常,会根据配置跳到登录失败页面}memRoles=mem.getMemRole(memb.getId());//根据查询的id查询角色与urlsUser.UserBuilder builder;if(memb!=null){String[] roles=memRoles.getRoleName().split(",");builder=org.springframework.security.core.userdetails.User.withUsername(username);builder.password(new BCryptPasswordEncoder().encode(memb.getPasswd()));for (String role:roles) {System.out.println(role);}builder.roles(roles);}else {throw new UsernameNotFoundException("member not found");}return builder.build();}
webconfig类。
@Configuration
@EnableWebSecurity
public class WebSecConfig extends WebSecurityConfigurerAdapter {@Beanpublic UserDetailsService userDetailsService(){return new UserDetailsServiceIm();}@Beanpublic BCryptPasswordEncoder passwordEncoder(){//数据库密码密码加密return new BCryptPasswordEncoder(){@Overridepublic String encode(CharSequence rawPassword) {// return MD5Utiles.encode(String.valueOf(rawPassword));return super.encode(rawPassword);}@Overridepublic boolean matches(CharSequence rawPassword, String encodedPassword) {// return encodedPassword.equals(MD5Utiles.encode(String.valueOf(rawPassword)));return super.matches(rawPassword, encodedPassword);}};}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());}@AutowiredMemberEn memberEn;@Overrideprotected void configure(HttpSecurity http) throws Exception {Map<String,String[]> map=memberEn.getRoleUrl();if (map!=null) {Iterator<?> iterator = map.entrySet().iterator();while (iterator.hasNext()) {Map.Entry entry = (Map.Entry) iterator.next();String url = (String) entry.getKey();String[] roles = (String[]) entry.getValue();if (roles.length > 0) {http.authorizeRequests().antMatchers(url).hasAnyRole(roles).anyRequest().authenticated();}}}else {System.out.println("未查询到用户类型对应url的映射");}http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login").defaultSuccessUrl("/mem/index.html").failureUrl("/login/error").permitAll().passwordParameter("password").usernameParameter("username").and().logout().logoutUrl("/test/api/exit").logoutSuccessUrl("/login").invalidateHttpSession(true).permitAll().and().csrf().disable();//关闭CSRF保护}@Override//web security忽略以下urlpublic void configure(WebSecurity web) throws Exception {super.configure(web);web.ignoring().antMatchers("/**/*.js","/**/*.css","/**/*.js","/**/*.jpg","/**/*.png","/**/*.jpeg","/test/*");}
编写相应的接口处理登录状态跳转(登录表单的action属性设成/login,不然无法拦截登录信息,这是spring security默认的,也可以进行修改)
@RequestMapping("/login")//内部用户登录拦截,spring security登录控制默认拦截/login路径,表单post为/login
public ModelAndView login(){return new ModelAndView("/login.html");
}@RequestMapping(value = "/login/error")
public @ResponseBody String doLoginError(){return "false";
}
控制层:拦截用户请求,并根据用户身份跳转
@Controller
@RequestMapping("/mem")
public class MemEnContr {private ModelAndView modelAndView;@RequestMapping("/index.html")//根据角色跳转,这里对应的是webconfig类中设置好的登录成功url跳转public ModelAndView doLogin(){switch (PermissionServer.getAuthe()){case "[ROLE_推荐单位]":modelAndView = new ModelAndView("redirect:/pro/hom/index.html");break;case "[ROLE_计划科]":modelAndView = new ModelAndView("redirect:/pro/hom/index.html");break;case "[ROLE_admin]":modelAndView = new ModelAndView("redirect:/pro/hom/index.html");break;case "[ROLE_其他科室]":modelAndView = new ModelAndView("redirect:/pro/hom/index.html");break;case "[ROLE_受理中心]":modelAndView = new ModelAndView("redirect:/pro/hom/index.html");default:modelAndView = new ModelAndView("redirect:/login");//未登录或权限不够break;}return modelAndView;}
注意登录表单post的action属性要设置为与websecconfig类中一致才能被拦截,还需设置将验证成功的跳转url指向控制层相应的@RequestMapping
.and().formLogin().loginPage("/login").permitAll().defaultSuccessUr
用户注销登录以及注销后跳转到登录页面:
.and().logout().logoutUrl("/mem/api/exit").logoutSuccessUrl("/login").permitAll().and().csrf().disable();//关闭CSRF保护
这里需要说明的是我们只需将页面的注销按钮的src="./mem/api/exit"即可,不需要再控制层实现/mem/api/exit的相关方法,spring将自动完成注销操作
spring security实现登录验证以及根据用户身份跳转不同页面相关推荐
- Spring Security自定义登录验证及登录返回结果
Spring Security自定义登录验证及登录返回结果 一.功能描述 二.处理逻辑 简单流程 自定义UserDetails 自定义UserDetailsDAO 自定义UserDetailsServ ...
- 关闭Spring security的登录验证
目的关闭Spring security 默认登录页 Springboot 2.x关闭需要在启动类上排除SecurityAutoConfiguration和ManagementWebSecurityAu ...
- Spring Security自定义登录验证,验证码,动态管理uri访问权限,Thymeleaf,限制密码强度、过期、错误密码锁定超时自动解锁、禁用历史密码、新密码和现密码差异要求编辑距离
在本教程中,我将指导您如何编写代码,以使用具有基于表单的身份验证的Spring安全API来保护Spring Boot应用程序中的网页.用户详细信息存储在MySQL数据库中,并使用春季JDBC连接到数据 ...
- oidc auth2.0_使用Spring Security 5.0和OIDC轻松构建身份验证
oidc auth2.0 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和 ...
- 使用Spring Security 5.0和OIDC轻松构建身份验证
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. Spri ...
- Spring Security MVC登录注销示例教程
Spring Security MVC登录注销示例教程 今天我们将了解Spring Security Login Example.在阅读这篇文章之前,请先阅读我在"Spring 4 Secu ...
- spring security+jwt 登录认证
spring security+jwt 登录认证 1.综述 2.版本与环境 3.架构 4.数据库认证逻辑图 5.案例 security+jwt 5.1引入依赖 5.2新建工具类 5.2新建组件类 5. ...
- spring Security 重复登录配置无效的问题
关于spring Security重复登录的配置,百度一大堆,我这里就不啰嗦了. 今天碰到 按照网上的配置,但是 感觉配置无效,同一用户还是可以登录,不知道为什么,开始以为是自己配置的又问题.再三确认 ...
- Spring Security笔记:使用数据库进行用户认证(form login using database) - 菩提树下的杨过 - 博客园...
Spring Security笔记:使用数据库进行用户认证(form login using database) - 菩提树下的杨过 - 博客园 在前一节,学习了如何自定义登录页,但是用户名.密码仍然 ...
最新文章
- base64编码的作用【转】
- mysql pt_GitHub - hcymysql/pt-kill: Percona PT-kill重构版(PHP)
- Linux下查看MySQL的安装路径
- leetcode76:最小覆盖字串(滑动窗口)
- php 移植 arm 精简,php5.4.5移植到arm-linux摘要,lighttpd配置
- C_C++编程题:选择填空、智力题
- 解决hibernate只能插入一条数据的问题
- python 科研作图_科研作图软件(11种)
- 一键下载QQ空间相册,微博相册,知乎回答图片,豆瓣图片,instagram图片
- 梁宁-产品思维-笔记
- c语言面试题东软,【东软集团程序员Java东软集团C语言面试题】面试问题:东软java面… - 看准网...
- python for循环语句1到100_python——循环语句
- 2016传智SSH框架CRM项目(5天)笔记(2017年5月20日22:11:15)
- 增长黑客AB-Test系统(三)——AB-Test Hash分流
- 全国大学生计算机设计大赛 南京作品展示,我校学子10件作品在2019中国大学生计算机设计大赛省赛中获奖...
- esp8266系列学习(四)——esp8266+手机端+路由器(路由可上网)组成物联网与广域网建立tcp通信的工作模式设定方法
- android中的插件开发框架,设计并开发一个 Android 的插件化框架
- 黑板粉笔字教师节PPT模板
- mysql导入行政区域数据
- 从0到1:神经网络实现图像识别(中)
热门文章
- xcode 4.5 new feature __ ios6 新特性 (转)
- 计算机网络相关的知识,计算机网络知识整理
- qa 芯片测试_芯片测试术语介绍CP、FT、WAT
- linux shell 变量 管道,linux下shell,变量,管道,重定向等基础知识及技巧
- phantomjs linux 中文不显示,linux 安装phantomJs 用于截图,处理中文乱码,和样式问题...
- java列出文件正则过滤_JAVA正则表达式过滤文件的实现方法
- mysql手注_php+mysql手注拿shell教程【朋友给的】
- 用python画动态皮卡丘_利用Python绘制萌萌哒的皮卡丘
- 【数据分析实例】数据领域的兄弟们的数据分析
- 六十三、SpringBoot中的日志框架SLF4j的使用