SpringSecurity如何实现配置单个HttpSecurity

一、创建项目并导入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

二、相关配置和代码

在创建完项目时,我们得springboot项目所有接口都被保护起来了,如果要想访问必须登陆,用户名默认是user,密码在项目启动时生成在控制台。

1)我们可以设置自己得账户和密码,有两种方法配置

1.1)在application.properties中配置

spring.security.user.name=fernfei

spring.security.user.password=fernfei

spring.security.user.roles=admin

1.2)在配置类中配置

  注:需要在配置类上加上@configuration注解

步骤1.2.1)

创建SecurityConfig继承WebSecurityConfigurerAdpater

步骤1.2.2)

实现WebSecurityConfigurerAdpater中的configure(AuthenticationManagerBuilder auth)方法

步骤1.2.3)

从 Spring5 开始,强制要求密码要加密,如果非不想加密,可 以使用一个过期的 PasswordEncoder 的实例

NoOpPasswordEncoder,但是不建议这么做,毕竟不安全。

这样就算完成自己定义账户密码了。

2)HttpSecurity配置

2.1)实现config(HttpSecurity http)方法

2.2)相关代码

@Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/admin/**").hasRole("admin")
        .antMatchers("/db/**").hasAnyRole("admin","user")
        .antMatchers("/user/**").access("hasAnyRole('admin','user')")
        //剩下的其他路径请求验证之后就可以访问
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginProcessingUrl("/dologin")
        .loginPage("/login")
        .usernameParameter("uname")
        .passwordParameter("pwd")
        .successHandler(new AuthenticationSuccessHandler() {
          @Override
          public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
            response.setContentType("application/json;charset=utf-8");
            PrintWriter pw = response.getWriter();
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("status", 200);
            map.put("msg", authentication.getPrincipal());
            pw.write(new ObjectMapper().writeValueAsString(map));
            pw.flush();
            pw.close();
          }
        })
        .failureHandler(new AuthenticationFailureHandler() {
          @Override
          public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
            response.setContentType("application/json;charset=utf-8");
            PrintWriter pw = response.getWriter();
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("status", 401);
            if (exception instanceof LockedException) {
              map.put("msg", "账户被锁定,登陆失败!");
            } else if (exception instanceof BadCredentialsException) {
              map.put("msg", "账户或者密码错误,登陆失败!");
            } else if (exception instanceof DisabledException) {
              map.put("msg", "账户被禁用,登陆失败!");
            } else if (exception instanceof AccountExpiredException) {
              map.put("msg", "账户已过期,登陆失败!");
            } else if (exception instanceof CredentialsExpiredException) {
              map.put("msg", "密码已过期,登陆失败!");
            } else {
              map.put("msg", "登陆失败!");
            }
            pw.write(new ObjectMapper().writeValueAsString(map));
            pw.flush();
            pw.close();
          }
        })
        .permitAll()
        .and()
        .csrf().disable();
  }

2.3)代码解释

2.3.1)/admin/**路径下的必须有admin角色才能访问

.antMatchers("/admin/**").hasRole("admin")

2.3.2)/db/**和/user/**下的路径,admin和user角色都可以访问

.antMatchers("/db/**").hasAnyRole("admin","user")

.antMatchers("/user/**").access("hasAnyRole('admin','user')")

2.3.3)表示剩下的任何请求只要验证之后都可以访问

.anyRequest().authenticated()

2.3.4)开启表单登陆

.formLogin()

2.3.5)登陆处理的路径

.loginProcessingUrl("/dologin")

2.3.6)登陆的页面,如果不写会使用默认的登陆页面

.loginPage("/login")

2.3.7)定义登录时,用户名的 key,默认为 username

.usernameParameter("uname")

2.3.7)定义登录时,用户名的 key,默认为 password

.passwordParameter("pwd")

2.3.8)登陆成功的处理(用于前后端分离时,直接返回json

.successHandler()

红框里面的类是存放登陆成功后的用户信息

2.3.9)下图就是登陆成功后直接返回url的方法

2.3.10)同上,登陆失败的处理

.failureHandler()

判断属于哪个异常可以更友好给用户作出提示

可以进入这个类按Ctrl+H查看类的继承关系,方便更好使用

2.3.11)permitALL()表示放开和登陆有关的接口,csrf是关闭csrf,以便我们在 postman类似的软件测试被系统给拦截了

.permitAll()

.and()

.csrf().disable();

3)controller层设置一些接口以便我们测试

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot整合Spring Security的详细教程

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架.提供了完善的认证机制和方法级的授权功能.是一款非常优秀的权限管理框架.它的核心是一组过滤器链,不同的功能经由不同的过滤器.这篇文章就是想通过一个小案例将Spring Security整合到SpringBoot中去.要实现的功能就是在认证服务器上

  • Spring Security使用数据库认证及用户密码加密和解密功能

    流程图: 1.接上一篇博客https://mp.csdn.net/console/editor/html/104576494,准备好环境. 2.spring-security.xml中的配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="

  • 详解Springboot2.3集成Spring security 框架(原生集成)

    0.pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0

  • Spring Security基于json登录实现过程详解

    主要是重写attemptAuthentication方法 导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot&l

  • Spring security基于数据库中账户密码认证

    一.原理分析 前台的登录请求发送到后端后会由spring security进行拦截,即controller层由框架自己提供.这样用户名和密码的认证就需要在service层完成,所以框架需要在service层获取到我们自己的数据库账号信息. spring security 提供了一个接口 UserDetailsService 来让用户提供账号和密码,其内容如下 public interface UserDetailsService { UserDetails loadUserByUsername(

  • Spring Security基于数据库实现认证过程解析

    创建数据库 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for role -- ---------------------------- DROP TABLE IF EXISTS `role`; CREATE TABLE `role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL, `nam

  • spring security数据库表结构实例代码

    PD建模图 建模语句 alter table SYS_AUTHORITIES_RESOURCES drop constraint FK_SYS_AUTH_REFERENCE_SYS_AUTH; alter table SYS_AUTHORITIES_RESOURCES drop constraint FK_SYS_AUTH_REFERENCE_SYS_RESO; alter table SYS_RESOURCES drop constraint FK_SYS_RESO_REFERENCE_SYS

  • Spring Security角色继承实现过程解析

    在SecurityConfig中加入 @Bean RoleHierarchy roleHierarchy(){ RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl(); String hierarchy ="ROLE_adb > ROLE_admin\n ROLE_admin > ROLE_user"; roleHierarchy.setHierarchy(hierarchy); return roleHierar

  • SpringSecurity如何实现配置单个HttpSecurity

    一.创建项目并导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <art

  • 详解springSecurity之java配置篇

    一 前言 本篇是springSecurity知识的入门第二篇,主要内容是如何使用java配置的方式进行配置springSeciruty,然后通过一个简单的示例自定义登陆页面,覆盖原有springSecurity默认的登陆页面:学习这篇的基础是 知识追寻者之前发布 过 的<springSecurity入门篇> 二 java配置 2.1配置账号密码 如下所示, 使用 @EnableWebSecurity 在配置类上开启security配置功能: 在配置类中定义bean 名为 UserDetails

  • SpringSecurity学习之自定义过滤器的实现代码

    我们系统中的认证场景通常比较复杂,比如说用户被锁定无法登录,限制登录IP等.而SpringSecuriy最基本的是基于用户与密码的形式进行认证,由此可知它的一套验证规范根本无法满足业务需要,因此扩展势在必行.那么我们可以考虑自己定义filter添加至SpringSecurity的过滤器栈当中,来实现我们自己的验证需要. 本例中,基于前篇的数据库的Student表来模拟一个简单的例子:当Student的jointime在当天之后,那么才允许登录 一.创建自己定义的Filter 我们先在web包下创

  • 解析spring-security权限控制和校验的问题

    前言     在我们项目中经常会涉及到权限管理,特别是一些企业级后台应用中,那权限管理是必不可少的.这个时候就涉及到技术选型的问题.在我以前项目中也没用到什么权限框架,就全部到一个spring mvc拦截器中去校验权限,当然,对需求比较少,小型的项目这也不失一个好的实现(实现简单,功能单一),但是对于一些比较大的应用,权限认证,session管理要求比较高的项目,如果再使用mvc拦截器,那就得不偿失了(需要自己去实现很多的代码).     现在比较流行的权限校验框架有spring-securit

  • SpringSecurity 表单登录的实现

    目录 表单登录 登录成功 登录失败 注销登录 自定义注销成功的返回内容 表单登录 @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated()

  • 解决Spring Security的权限配置不生效问题

    目录 SpringSecurity权限配置不生效 1.不生效的例子 2.解决办法 SpringSecurity动态配置权限 导入依赖 相关配置 创建UserMapper类&&UserMapper.xml 创建UserServiceMenuService 创建CustomFilterInvocationSecurityMetadataSource 创建CustomAccessDecisionManager 创建WebSecurityConfig配置类 Spring Security权限配置不

  • Java SpringSecurity+JWT实现登录认证

    目录 整合步骤 实现原理 目录结构 做了哪些变化 前言: 学习过我的mall项目的应该知道,mall-admin模块是使用SpringSecurity+JWT来实现登录认证的,而mall-portal模块是使用的SpringSecurity基于Session的默认机制来实现登陆认证的.很多小伙伴都找不到mall-portal的登录接口,最近我把这两个模块的登录认证给统一了,都使用SpringSecurity+JWT的形式实现.主要是通过把登录认证的通用逻辑抽取到了mall-security模块来

  • SpringBoot整合SpringSecurity实现JWT认证的项目实践

    目录 前言 1.创建SpringBoot工程 2.导入SpringSecurity与JWT的相关依赖 3.定义SpringSecurity需要的基础处理类 4. 构建JWT token工具类 5.实现token验证的过滤器 6. SpringSecurity的关键配置 7. 编写Controller进行测试 前言 微服务架构,前后端分离目前已成为互联网项目开发的业界标准,其核心思想就是前端(APP.小程序.H5页面等)通过调用后端的API接口,提交及返回JSON数据进行交互.在前后端分离项目中,

  • Nginx服务器高性能优化的配置方法小结

    通常来说,一个优化良好的 Nginx Linux 服务器可以达到 500,000 – 600,000 次/秒 的请求处理性能,然而我的 Nginx 服务器可以稳定地达到 904,000 次/秒 的处理性能,并且我以此高负载测试超过 12 小时,服务器工作稳定. 这里需要特别说明的是,本文中所有列出来的配置都是在我的测试环境验证的,而你需要根据你服务器的情况进行配置: 从 EPEL 源安装 Nginx: yum -y install nginx 备份配置文件,然后根据你的需要进行配置: cp /e

  • Flask配置Cors跨域的实现

    1 跨域的理解 跨域是指:浏览器A从服务器B获取的静态资源,包括Html.Css.Js,然后在Js中通过Ajax访问C服务器的静态资源或请求.即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源. 同源策略是指:浏览器A从服务器B获取的静态资源,包括Html.Css.Js,为了用户安全,浏览器加了限制,其中的Js通过Ajax只能访问B服务器的静态资源或请求.即:浏览器A从哪拿的资源,那资源中就只能访问哪. 同源是指:同一个请求协议(如:Http或Https).同一个Ip.同一个端口,3个全

随机推荐