Spring Security OAuth 2.0 认证授权

1.基于Session的认证流程

依赖包

 <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>

Spring Security 本质是一个过滤链

重要的接口

1.UserDetailsService

查询数据库中的账户名和密码

2.PasswordEncoder

加密接口

Web权限方案:认证和授权

设置登录名和密码的方案

1.通过配置文件

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

2.编写

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String password = passwordEncoder.encode("123");
        auth.inMemoryAuthentication().withUser("lucy").password(password).roles("admin");
    }
    @Bean
    PasswordEncoder password() {
        return new BCryptPasswordEncoder();
    }
}

3.自定义编写实现类

1.创建配置类,设置使用userDetailsServices实现类
2.编写实现类,返回User对象,User对象有用户名密码和操作
@Service
public class MyUserDetailService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("role");
        return new User("marry", new BCryptPasswordEncoder().encode("123"), auths);
    }
}

查询数据库完成用户认证

1.引入相关依赖

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

2.创建数据库和用户表

3.创建User表对应实体类

4.整合Mapper

5.在MyUserDetailsService 调用mapper里面方法查询数据库进行用户认证

6.添加mapperScan

7.配置数据库

自定义配置页面

  @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                // 登陆页面
                .loginPage("/login.html")
                //登录访问路径
                .loginProcessingUrl("/user/login")
                //登录之后跳转路径
                .defaultSuccessUrl("/test/index").permitAll()
                .and().authorizeRequests()
                // 设置那些路径可以直接访问,不需要认证
                .antMatchers("/", "/test/hello", "/user/login").permitAll()
                .anyRequest().authenticated()
                //关闭csrf防护
                .and().csrf().disable();
    }

基于角色或权限控制访问与授权

1.HasAuthority方法

1.在配置类设置当前访问地址有哪些权限

 //当前用户只有具有admin权限才可以访问这个路径
                .antMatchers("/test/index").hasAnyAuthority("admins")

2.在UserDetailsServices里做设置

 List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("admins");

2.hasAnyAuthority方法

.antMatchers("/text/index").hasAnyAuthority("admins,manager")

3.hasRole方法

源码中返回的结果为

return "hasRole('ROLE_" + role + "')";
//拥有此权限才允许访问
List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale");

4.hasAnyRole方法

与HasAnyAuthority相似

自定义403无权限访问页面

image-20210110162525807

直接在配置类中进行设置

注解的使用

@Secured

image-20210111000351243

@PreAuthorize

image-20210111000446832

@PostAuthorize

image-20210111000532067

解决跨域请求的问题

image-20210111003010203

用户注销的实现

1.在配置类中添加退出配置

image-20210120223104916

自动登录

1.cookies技术

2.安全框架机制实现自动登录

实现原理

image-20210120231543690

具体实现

1.创建数据库表

2.注入数据源

    @Bean
    public PersistentTokenRepository persistentTokenRepository() {
        JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
        jdbcTokenRepository.setDataSource(dataSource);
        // jdbcTokenRepository.setCreateTableOnStartup(true);
        return jdbcTokenRepository;
    }

3.配置类中配置自动登录

/**
 * //操作数据库对象
 */
.and().rememberMe().tokenRepository(persistentTokenRepository())
/**
 * 设置有效时常,单位秒
 */
.tokenValiditySeconds(60)
/**
 * 操作数据库
 */
.userDetailsService(userDetailsService)

5.测试页面

image-20210120230735554

name名称remember-me不可以为其他的

CSRF理解

会针对PATCH、Post、Put、Delete方法进行保护

SpringSecurity微服务权限方案

1.权限管理数据模型

image-20210121000041018

需求:

1.添加用户

2.为角色分配菜单

3.添加用户

4.为用户分配角色

2.案例设计技术说明

1.Maven

2.Spring Boot

3.MyBatisPlus 操作数据库框架

4.Spring Cloud

(1)GateWay网关

(2)注册中心 NacOS

5.Redis

JWT

Swagger

3.搭建项目和服务

image-20210121004721230

2.引入依赖

3.启动Redis Nacos

(1)、启动Redis

(2)、启动Nacos

http://192.168.187.128:8848/nacos/index.html

4.编写代码

image-20210123231338039

跨域问题的产生:

ip地址 端口号 协议的不同就产生了跨域的问题

Q.E.D.


纵我不往,子宁不嗣音?。纵我不往,子宁不来?