【springsecurity】简介,SpringSecurity

在这里插入图片描述
在这里插入图片描述

1.Spring 无缝整合。
2.全面的权限控制。
3.专门为 Web 开发而设计。
  3.1 旧版本不能脱离 Web 环境使用。
  3.2 新版本对整个框架进行了分层抽取,分成了核心模块和 Web 模块。单独引入核心模块就可以脱离 Web 环境。
4.重量级(缺点)

在这里插入图片描述

1.轻量级。Shiro 主张的理念是把复杂的事情变简单。针对对性能有更高要求的互联网应用有更好表现。
2.通用性。
   2.1 好处:不局限于Web环境,可以脱离Web环境使用。
   2.2 缺陷:在Web环境下一些特定的需求需要手动编写代码定制。

在这里插入图片描述

SpringSecuritySpring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,
但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下。相对于Shiro,在 SSM 中整合 Spring Security 都是比较麻烦的操作,所以,
SpringSecurity 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有Spring Security 多,但是对于大部分项目而言,Shiro 也够用了)。
自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了自动化配置方案,可以使用更少的配置来使用 Spring Security。
因此,一般来说,常见的安全管理技术栈的组合是这样的:
• SSM + ShiroSpring Boot/Spring Cloud + Spring Security
以上只是一个推荐的组合而已,如果单纯从技术上来说,无论怎么组合,都是可以运行
的。

在这里插入图片描述


在这里插入图片描述

@Configuration
public class SecurityConfigextends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
   http.formLogin() // 表单登录
   .and()
   .authorizeRequests() // 认证配置
   .anyRequest() // 任何请求
   .authenticated(); // 都需要身份验证
  }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter
org.springframework.security.web.context.SecurityContextPersistenceFilter 
org.springframework.security.web.header.HeaderWriterFilter
org.springframework.security.web.csrf.CsrfFilter
org.springframework.security.web.authentication.logout.LogoutFilter 
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter 
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter 
org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter
org.springframework.security.web.savedrequest.RequestCacheAwareFilter
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
org.springframework.security.web.authentication.AnonymousAuthenticationFilter 
org.springframework.security.web.session.SessionManagementFilter 
org.springframework.security.web.access.ExceptionTranslationFilter 
org.springframework.security.web.access.intercept.FilterSecurityInterceptor

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// 表示获取登录用户所有权限
Collection<? extends GrantedAuthority> getAuthorities();
// 表示获取密码
String getPassword();
// 表示获取用户名
String getUsername();
// 表示判断账户是否过期
boolean isAccountNonExpired();
// 表示判断账户是否被锁定
boolean isAccountNonLocked();
// 表示凭证{密码}是否过期
boolean isCredentialsNonExpired();
// 表示当前用户是否可用
boolean isEnabled();

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// 表示把参数按照特定的解析规则进行解析
String encode(CharSequence rawPassword);
// 表示验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。如果密码匹
//配,则返回 true;如果不匹配,则返回 false。第一个参数表示需要被解析的密码。第二个
//参数表示存储的密码。
boolean matches(CharSequence rawPassword, String encodedPassword);
// 表示如果解析的密码能够再次进行解析且达到更安全的结果则返回 true,否则返回
//false。默认返回 false。
default boolean upgradeEncoding(String encodedPassword) {
return false; }

在这里插入图片描述
在这里插入图片描述

@Test
public void test01(){
	// 创建密码解析器
	BCryptPasswordEncoder bCryptPasswordEncoder = new 
	BCryptPasswordEncoder();
	// 对密码进行加密
	String atguigu = bCryptPasswordEncoder.encode("atguigu");
	// 打印加密之后的数据
	System.out.println("加密之后数据:\t"+atguigu);
	//判断原字符加密后和加密之前是否匹配
	boolean result = bCryptPasswordEncoder.matches("atguigu", atguigu);
	// 打印比较结果
	System.out.println("比较结果:\t"+result);
}

在这里插入图片描述

spring.security.user.name=atguigu
spring.security.user.password=atguigu

在这里插入图片描述

package com.atguigu.service;
@Service
public class LoginService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
	 // 判断用户名是否存在
	 if (!"admin".equals(username)){
	   throw new UsernameNotFoundException("用户名不存在!");
	 }
	 // 从数据库中获取的密码 atguigu 的密文
	 String pwd = "$2a$10$2R/M6iU3mCZt3ByG7kwYTeeW0w7/UqdeXrb27zkBIizBvAven0/na";
	 // 第三个参数表示权限
	 return new User(username,pwd, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,"));
 } 
}

在这里插入图片描述

create table users(
	 id bigint primary key auto_increment,
	 username varchar(20) unique not null,
	 password varchar(100)
);
-- 密码 atguigu
insert into users values(1,'张san','$2a$10$2R/M6iU3mCZt3ByG7kwYTeeW0w7/UqdeXrb27zkBIizBvAven0/na');
-- 密码 atguigu
insert into users values(2,'李si','$2a$10$2R/M6iU3mCZt3ByG7kwYTeeW0w7/UqdeXrb27zkBIizBvAven0/na');

create table role(
	id bigint primary key auto_increment,
	name varchar(20)
);
insert into role values(1,'管理员');
insert into role values(2,'普通用户');

create table role_user(
	uid bigint,
	rid bigint
);
insert into role_user values(1,1);
insert into role_user values(2,2);

create table menu(
	id bigint primary key auto_increment,
	name varchar(20),
	url varchar(100),
	parentid bigint,
	permission varchar(20)
);
insert into menu values(1,'系统管理','',0,'menu:system');
insert into menu values(2,'用户管理','',0,'menu:user');

create table role_menu(
	mid bigint,
	rid bigint
);
insert into role_menu values(1,1);
insert into role_menu values(2,1);
insert into role_menu values(2,2);

<dependencies>
	 <dependency>
		 <groupId>org.springframework.boot</groupId>
		 <artifactId>spring-boot-starter-web</artifactId>
	 </dependency>
	 <dependency>
		 <groupId>org.springframework.boot</groupId>
		 <artifactId>spring-boot-starter-security</artifactId>
	 </dependency>
	 <dependency>
		 <groupId>org.springframework.boot</groupId>
		 <artifactId>spring-boot-starter-test</artifactId>
		 <scope>test</scope>
	 </dependency>
	 <!--mybatis-plus-->
	 <dependency>
		 <groupId>com.baomidou</groupId>
		 <artifactId>mybatis-plus-boot-starter</artifactId>
		 <version>3.0.5</version>
	 </dependency>
	 <!--mysql-->
	 <dependency>
		 <groupId>mysql</groupId>
		 <artifactId>mysql-connector-java</artifactId>
	 </dependency>
	 <!--lombok 用来简化实体类-->
	 <dependency>
		 <groupId>org.projectlombok</groupId>
		 <artifactId>lombok</artifactId>
	 </dependency>
</dependencies>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
	 @Autowired
	 private UsersMapper usersMapper;
	 
	 @Override
	 public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
		 QueryWrapper<Users> wrapper = new QueryWrapper();
		 wrapper.eq("username",s);
		 Users users = usersMapper.selectOne(wrapper);
		 if(users == null) {
		 throw new UsernameNotFoundException("用户名不存在!");
		 }
		 System.out.println(users);
		 List<GrantedAuthority> auths =
		 AuthorityUtils.commaSeparatedStringToAuthorityList("role");
		 return new User(users.getUsername(),
		 new BCryptPasswordEncoder().encode(users.getPassword()),auths);
 }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// 注入 PasswordEncoder 类到 spring 容器中
@Bean
  public PasswordEncoder passwordEncoder(){
  	 return new BCryptPasswordEncoder();
  }
  @Override
  protected void configure(HttpSecurity http) throws Exception {
	 http.authorizeRequests()
	 .antMatchers("/layui/**","/index") //表示配置请求路径
	.permitAll() // 指定 URL 无需保护。
	.anyRequest() // 其他请求
	.authenticated(); //需要认证
  }
}

在这里插入图片描述
在这里插入图片描述

@Override
protected void configure(HttpSecurity http) throws Exception {
	// 配置认证
	http.formLogin()
	    .loginPage("/index") // 配置哪个 url 为登录页面
	    .loginProcessingUrl("/login") // 设置哪个是登录的 url。
	    .successForwardUrl("/success") // 登录成功之后跳转到哪个 url
	    .failureForwardUrl("/fail");// 登录失败之后跳转到哪个 url
	http.authorizeRequests()
	    .antMatchers("/layui/**","/index") //表示配置请求路径
	    .permitAll() // 指定 URL 无需保护。
	    .anyRequest() // 其他请求
	    .authenticated(); //需要认证
	    // 关闭 csrf
	    http.csrf().disable();
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<?xml version="1.0"encoding="utf-8"?>
<!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 
3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="com.atguigu.mapper.UserInfoMapper">
<!--根据用户 Id 查询角色信息--> 
<select id="selectRoleByUserId"resultType="com.atguigu.bean.Role">
    SELECT r.id,r.name FROM role r INNER JOIN role_user ru ON ru.rid=r.id where ru.uid=#{0}
</select>
<!--根据用户 Id 查询权限信息--> 
<select id="selectMenuByUserId"resultType="com.atguigu.bean.Menu">
	 SELECT m.id,m.name,m.url,m.parentid,m.permission FROM menu m
	 INNER JOIN role_menu rm ON m.id=rm.mid
	 INNER JOIN role r ON r.id=rm.rid
	 INNER JOIN role_user ru ON r.id=ru.rid
	 WHERE ru.uid=#{0}
</select>
</mapper>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@SpringBootApplication
@EnableGlobalMethodSecurity(securedEnabled=true)
public class DemosecurityApplication {
   public static void main(String[] args) {
      SpringApplication.run(DemosecurityApplication.class, args);
   } 
}

在这里插入图片描述
在这里插入图片描述

@RequestMapping("/preAuthorize")
@ResponseBody
//@PreAuthorize("hasRole('ROLE_管理员')")
@PreAuthorize("hasAnyAuthority('menu:system')")
public String preAuthorize(){
   System.out.println("preAuthorize");
return "preAuthorize"; }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CREATE TABLE `persistent_logins` (
	 `username` varchar(64) NOT NULL,
	 `series` varchar(64) NOT NULL,
	 `token` varchar(64) NOT NULL,
	 `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	 PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_树先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值