SpringSecurity简单使用

SpringSecurity简单使用

前言

1、什么是spring security

一个能够为基于Spring的企业应用系统提供声明式的安全訪问控制解决方式的安全框架(简单说是对访问权限进行控制)。

应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。

用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。

用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。

用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。

比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。

一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

spring security的主要核心功能为 认证和授权,所有的架构也是基于这两个核心功能去实现的。

2、spring security简介

众所周知想要对Web资源进行保护,最好的办法莫过于Filter,要想对方法调用进行保护,最好的办法莫过于AOP。所以springSecurity在我们进行用户认证以及授予权限的时候,通过各种各样的拦截器来控制权限的访问,从而实现安全。

spring Security功能的实现主要是由一系列过滤器链相互配合完成。

SpringSecurity简单使用_第1张图片

1.springSecurityFilterChain中各个过滤器怎么创建的只需了解即可。不要太过关注。

2.重点记忆UsernamePasswordAuthenticationFilter,ExceptionTranslationFilter, FilterSecurityInterceptor这三个过滤器的作用及源码分析。

3.重点记忆认证中Authentication,AuthenticationManager,ProviderManager, AuthenticationProvider,UserDetailsService,UserDetails这些类的作用及源码分析。

4.重点记忆授权中FilterInvoction,SecurityMetadataSource,AccessDecisionManager的作用。

3 框架的核心组件

SecurityContextHolder:提供对SecurityContext的访问

SecurityContext,:持有Authentication对象和其他可能需要的信息

AuthenticationManager 其中可以包含多个AuthenticationProvider

ProviderManager对象为AuthenticationManager接口的实现类

AuthenticationProvider 主要用来进行认证操作的类 调用其中的authenticate()方法去进行认证操作

Authentication:Spring Security方式的认证主体

GrantedAuthority:对认证主题的应用层面的授权,含当前用户的权限信息,通常使用角色表示

UserDetails:构建Authentication对象必须的信息,可以自定义,可能需要访问DB得到

UserDetailsService:通过username构建UserDetails对象,通过loadUserByUsername根据userName获取UserDetail对象

(可以在这里基于自身业务进行自定义的实现 如通过数据库,xml,缓存获取等)

1、导入依赖

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
    <version>3.0.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2、编写测试代码

由于这里就是为了测试,所以就不写html页面了,页面可以随便写点。

SpringSecurity简单使用_第2张图片

controller包

@Controller
public class RouterController {

    @RequestMapping({"/","/index"})
    public String index(){
        return "index";
    }

    @RequestMapping("/tologin")
    public String login(){
        return "views/login";
    }

    @RequestMapping("/page1/{id}")
    public String page1(@PathVariable("id") int id){
        return "views/page1/page"+id;
    }
    @RequestMapping("/page2/{id}")
    public String page2(@PathVariable("id") int id){
        return "views/page2/page"+id;
    }
    @RequestMapping("/page3/{id}")
    public String page3(@PathVariable("id") int id){
        return "views/page3/page"+id;
    }
}

3、开启springsecurity

SpringSecurity简单使用_第3张图片

使用注解

@EnableWebSecurity

WebSecurityConfig类使用了@EnableWebSecurity注解 ,以启用Spring Security的Web安全支持,并提供Spring MVC集成。它还扩展了WebSecurityConfigurerAdapter,并覆盖了一些方法来设置Web安全配置的一些细节。

继承WebSecurityConfigurerAdapter

public class securityConfig extends WebSecurityConfigurerAdapter

4、授权

//链式编程
protected void configure(HttpSecurity http) throws Exception {
    //首页所有人都可以访问,功能页只有对应权限的人可以访问
    //请求授权的规则
    http.authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/page1/**").hasRole("vip1")
            .antMatchers("/page2/**").hasRole("vip2")
            .antMatchers("/page3/**").hasRole("vip3");
    //没有权限到登陆页面,默认的登陆页面
    http.formLogin().loginPage("/tologin");
    //防止网站工具
    http.csrf().disable();
    //注销
    http.logout().logoutSuccessUrl("/");
    //开启记着我功能,cookie默认存两周
    http.rememberMe().rememberMeParameter("rember");
}

5、认证

//认证
//密码编码 passwordEncode
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
            .withUser("x").password(new BCryptPasswordEncoder().encode("12")).roles("vip1")
            .and()
            .withUser("d").password(new BCryptPasswordEncoder().encode("12")).roles("vip1","vip2")
            .and()
            .withUser("l").password(new BCryptPasswordEncoder().encode("12")).roles("vip3");
}

6、学习总结

​ 结合spring官方文档,并且查看springsecurity源码可以很快上手

你可能感兴趣的:(SSM,SpringBoot,java,spring,boot,spring,安全)