引入maven依赖

 <!-- 放入spring security依赖  -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

Spring Security配置类

SecurityConfig.java

package com.example.demo.security;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder; /**
* 配置类
* @EnableWebSecurity 开启Security功能
*/
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) //允许通过注解的方法拦截
public class SecurityConfig extends WebSecurityConfigurerAdapter { /**
* 用于密码加密
* @return
*/
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
} /**
* 进行授权
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception{
/**
*定制请求的授权规则
* permitAll() 表示都允许访问
* hasRole("admin") 表示用户必须有admin的角色才能访问
*/ http.authorizeRequests().antMatchers("/").permitAll()
.antMatchers("/add").hasRole("admin"); /**
* 开启自动配置的登录功能,如果没有权限就会来到登录页面
* 1、 /login 请求进入登录页,可自定义
* 表单的用户名name 默认为username
* 密码name 默认为 password
*
* usernameParameter 参数可以设置表单中用户名的name
* passwordParameter 参数可以设置表单中密码的name
*
* 2、重定向到/login?error 表示登录失败
* 定义登录页 /toLogin 请求
* loginProcessingUrl("") 设置登录提交的请求链接
*/
http.formLogin().
loginPage("/toLogin")
.usernameParameter("username")
.passwordParameter("pwd")
.loginProcessingUrl("/login"); /**
* 关闭csrf功能,禁用跨站请求,进行安全访问
*/
http.csrf().disable(); /**
* 开启记住我功能,登录信息保存cookie,
* 默认保存两周
* rememberMeParameter 参数设置表单中 记住我 的name名
*/
http.rememberMe().rememberMeParameter("rememberMe"); /**
* 开启自动配置的注销功能
* 1、访问 logout 表示用户注销,清空session
* 可以通过
* Authentication authentication=SecurityContextHolder.getContext().getAuthentication();
* authentication.getPrincipal(); 获取登录用户信息
*
*
*
* 2、注销成功默认会请求 /login?logout (登录页面)
* 可以通过logoutSuccessUrl() 方法自定义退出成功后的地址
*/
http.logout().logoutSuccessUrl("/"); } /**
* 认证 springboot 2.1.x可以直接使用
* 密码编码 :passwordEncoder
* 在spring security 5.0+ 新增了加密方法
*
* @param auth
* @throws Exception
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
auth.userDetailsService(new UserServiceConfig());
}
}

Spring Security 查询用户信息类

UserServiceConfig.java

package com.example.demo.security;

import com.example.demo.entity.CmsUser;
import com.example.demo.entity.Role;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder; import java.util.ArrayList;
import java.util.List; @Configuration
public class UserServiceConfig implements UserDetailsService { @Autowired
private PasswordEncoder passwordEncoder; @Autowired
private UserService userService; /**
* 根据用户名查找用户
* @param username 用户在浏览器输入的用户名
* @return UserDetails 是spring security自己的用户对象
* @throws UsernameNotFoundException
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
CmsUser cmsUser =userService.findByUsername(username); if (cmsUser==null){
//表示查询不到用户,认证失败
return null;
} /**
* 这里为了演示进行了密码加密,实际开发中应该是用户在进行注册时就对密码进行加密,
* 这里直接取数据库的密码进行比对即可,不需要再进行加密
*/
String password=passwordEncoder.encode(cmsUser.getPassword()); /**
* 添加该用户的角色信息
* roleName 是角色名称
*/
List<SimpleGrantedAuthority> authorities=new ArrayList<>();
List<Role> roles=cmsUser.getRoles();
for (Role role:roles){
authorities.add(new SimpleGrantedAuthority(role.getRoleName()));
} return new User(cmsUser.getUsername(),password,authorities);
} }

自定义错误页面

ErrorPageConfig.java

package com.example.demo.security;

import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus; /**
* 定制错误页面
*/
@Configuration
public class ErrorPageConfig implements ErrorPageRegistrar { @Override
public void registerErrorPages(ErrorPageRegistry registry) { /**
* 定制禁止访问错误页面
* /403 是错误页面的跳转请求
*/
ErrorPage errorPage=new ErrorPage(HttpStatus.FORBIDDEN,"/403"); registry.addErrorPages(errorPage); }
}

SpringBoot 整合Spring Security框架的更多相关文章

  1. SpringBoot整合Spring Security

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 Spring Securi ...

  2. springBoot整合spring security实现权限管理(单体应用版)--筑基初期

    写在前面 在前面的学习当中,我们对spring security有了一个小小的认识,接下来我们整合目前的主流框架springBoot,实现权限的管理. 在这之前,假定你已经了解了基于资源的权限管理模型 ...

  3. springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期

    写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...

  4. SpringBoot整合Spring Security使用Demo

    https://start.spring.io/ 生成SpringBoot项目 pom文件应该是我这样的: <?xml version="1.0" encoding=&quo ...

  5. SpringBoot 整合 spring security oauth2 jwt完整示例 附源码

    废话不说直接进入主题(假设您已对spring security.oauth2.jwt技术的了解,不懂的自行搜索了解) 依赖版本 springboot 2.1.5.RELEASE spring-secu ...

  6. SpringBoot整合Light Security框架

    官方git地址:https://gitee.com/itmuch/light-security/tree/master 引入maven <dependency> <groupId&g ...

  7. springboot配置spring security 静态资源不能访问

    在springboot整合spring security 过程中曾遇到下面问题:(spring boot 2.0以上版本   spring security 5.x    (spring  secur ...

  8. springboot+maven整合spring security

    springboot+maven整合spring security已经做了两次了,然而还是不太熟悉,这里针对后台简单记录一下需要做哪些事情,具体的步骤怎么操作网上都有,不再赘述.1.pom.xml中添 ...

  9. SpringBoot安全篇Ⅵ --- 整合Spring Security

    知识储备: 关于SpringSecurity的详细学习可以查看SpringSecurity的官方文档. Spring Security概览 应用程序的两个主要区域是"认证"和&qu ...

随机推荐

  1. 洛谷 P4548 - [CTSC2006]歌唱王国(概率生成函数)

    洛谷题面传送门 PGF 入门好题. 首先介绍一下 PGF 的基本概念.对于随机变量 \(X\),满足 \(X\) 的取值总是非负整数,我们即 \(P(v)\) 表示 \(X=v\) 的概率,那么我们定 ...

  2. SPOJ 1557 GSS2 - Can you answer these queries II (线段树+维护历史最值)

    都说这题是 GSS 系列中最难的,今天做了一下,名副其实 首先你可以想到各种各样的在线乱搞想法,线段树,主席树,平衡树,等等,但发现都不太可行. 注意到题目也没有说强制在线,因此可以想到离线地去解决这 ...

  3. Codeforces 1499G - Graph Coloring(带权并查集+欧拉回路)

    Codeforces 题面传送门 & 洛谷题面传送门 一道非常神仙的题 %%%%%%%%%%%% 首先看到这样的设问,做题数量多一点的同学不难想到这个题.事实上对于此题而言,题面中那个&quo ...

  4. Codeforces 1158F - Density of subarrays(dp,神仙题)

    Codeforces 题目传送门 & 洛谷题目传送门 人生中第一道 *3500(显然不是自己独立 AC 的),不过还是祭一下罢 神仙 D1F 首先考虑对于给定的序列 \(a_1,a_2,\do ...

  5. Perl if条件判断

    Perl 条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 条件判断常用: True         #布尔值 not True   #布尔值 ! True    ...

  6. nordic 51822 sdk. timer 的使用

    它的源代码和头文件分别为app_timer.c/app_timer.h.这是Nordic为我们提供的虚拟定时器,这个定时器不同于硬件上的TIMER,而是基于RTC1实现的一种虚拟定时器,其将定时功能作 ...

  7. day9 图书设计项目

    总路由层url from django.conf.urls import url from django.contrib import admin from app01 import views ur ...

  8. android 下动态获取控件的id

    有时候我们需要动态的取得一个一个控件的id,然后进行操作,经过在网上查找,找到了一下方法getResources().getIdentifier("textView01", &qu ...

  9. zabbix之监控面试

    先用shell脚本把值取出来,然后重启agent,在server端用zabbix-get命令测试一下,看能不能通过userparameter指定的可以将值取出来,如果没问题,在在网页创建模板,加监控项 ...

  10. Type of 'this' pointer in C++

    In C++, this pointer is passed as a hidden argument to all non-static member function calls. The typ ...