想关依赖,采用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实现登录验证以及根据用户身份跳转不同页面相关推荐

  1. Spring Security自定义登录验证及登录返回结果

    Spring Security自定义登录验证及登录返回结果 一.功能描述 二.处理逻辑 简单流程 自定义UserDetails 自定义UserDetailsDAO 自定义UserDetailsServ ...

  2. 关闭Spring security的登录验证

    目的关闭Spring security 默认登录页 Springboot 2.x关闭需要在启动类上排除SecurityAutoConfiguration和ManagementWebSecurityAu ...

  3. Spring Security自定义登录验证,验证码,动态管理uri访问权限,Thymeleaf,限制密码强度、过期、错误密码锁定超时自动解锁、禁用历史密码、新密码和现密码差异要求编辑距离

    在本教程中,我将指导您如何编写代码,以使用具有基于表单的身份验证的Spring安全API来保护Spring Boot应用程序中的网页.用户详细信息存储在MySQL数据库中,并使用春季JDBC连接到数据 ...

  4. oidc auth2.0_使用Spring Security 5.0和OIDC轻松构建身份验证

    oidc auth2.0 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和 ...

  5. 使用Spring Security 5.0和OIDC轻松构建身份验证

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. Spri ...

  6. Spring Security MVC登录注销示例教程

    Spring Security MVC登录注销示例教程 今天我们将了解Spring Security Login Example.在阅读这篇文章之前,请先阅读我在"Spring 4 Secu ...

  7. spring security+jwt 登录认证

    spring security+jwt 登录认证 1.综述 2.版本与环境 3.架构 4.数据库认证逻辑图 5.案例 security+jwt 5.1引入依赖 5.2新建工具类 5.2新建组件类 5. ...

  8. spring Security 重复登录配置无效的问题

    关于spring Security重复登录的配置,百度一大堆,我这里就不啰嗦了. 今天碰到 按照网上的配置,但是 感觉配置无效,同一用户还是可以登录,不知道为什么,开始以为是自己配置的又问题.再三确认 ...

  9. Spring Security笔记:使用数据库进行用户认证(form login using database) - 菩提树下的杨过 - 博客园...

    Spring Security笔记:使用数据库进行用户认证(form login using database) - 菩提树下的杨过 - 博客园 在前一节,学习了如何自定义登录页,但是用户名.密码仍然 ...

最新文章

  1. base64编码的作用【转】
  2. mysql pt_GitHub - hcymysql/pt-kill: Percona PT-kill重构版(PHP)
  3. Linux下查看MySQL的安装路径
  4. leetcode76:最小覆盖字串(滑动窗口)
  5. php 移植 arm 精简,php5.4.5移植到arm-linux摘要,lighttpd配置
  6. C_C++编程题:选择填空、智力题
  7. 解决hibernate只能插入一条数据的问题
  8. python 科研作图_科研作图软件(11种)
  9. 一键下载QQ空间相册,微博相册,知乎回答图片,豆瓣图片,instagram图片
  10. 梁宁-产品思维-笔记
  11. c语言面试题东软,【东软集团程序员Java东软集团C语言面试题】面试问题:东软java面… - 看准网...
  12. python for循环语句1到100_python——循环语句
  13. 2016传智SSH框架CRM项目(5天)笔记(2017年5月20日22:11:15)
  14. 增长黑客AB-Test系统(三)——AB-Test Hash分流
  15. 全国大学生计算机设计大赛 南京作品展示,我校学子10件作品在2019中国大学生计算机设计大赛省赛中获奖...
  16. esp8266系列学习(四)——esp8266+手机端+路由器(路由可上网)组成物联网与广域网建立tcp通信的工作模式设定方法
  17. android中的插件开发框架,设计并开发一个 Android 的插件化框架
  18. 黑板粉笔字教师节PPT模板
  19. mysql导入行政区域数据
  20. 从0到1:神经网络实现图像识别(中)

热门文章

  1. xcode 4.5 new feature __ ios6 新特性 (转)
  2. 计算机网络相关的知识,计算机网络知识整理
  3. qa 芯片测试_芯片测试术语介绍CP、FT、WAT
  4. linux shell 变量 管道,linux下shell,变量,管道,重定向等基础知识及技巧
  5. phantomjs linux 中文不显示,linux 安装phantomJs 用于截图,处理中文乱码,和样式问题...
  6. java列出文件正则过滤_JAVA正则表达式过滤文件的实现方法
  7. mysql手注_php+mysql手注拿shell教程【朋友给的】
  8. 用python画动态皮卡丘_利用Python绘制萌萌哒的皮卡丘
  9. 【数据分析实例】数据领域的兄弟们的数据分析
  10. 六十三、SpringBoot中的日志框架SLF4j的使用