Spring Security 入门

Scroll Down

Spring Security 入门

因为原来的安全管理难度太大,使用框架使构建成本小了很多

参考:https://www.cnblogs.com/lenve/p/11242055.html

配置

maven依赖

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

然后Spring Security就默认接管了安全策略

自定义访问控制

实验环境

编写三个页面

  1. vip1.html
  2. vip2.html
  3. vip3.html

分别需要三个权限等级才能进入

注意:我没有编写Login.html

编写一个Controller,进行路由

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

@RequestMapping("/vip1")
public String vip1()
{
    return "/vip1";
}
@RequestMapping("/vip2")
public String vip2()
{
    return "/vip2";
}
@RequestMapping("/vip3")
public String vip3()
{
    return "/vip3";
}

编写主页index.html里面包含三个指向下面这三个方法的链接

不配置任何东西

spring security 已经接管了这个网站

无论访问什么网页都会是/login。这个login不是我自己写的,是spring security自动生成的

默认情况下,登录的用户名是 user ,密码则是项目启动时随机生成的字符串,可以从启动的控制台日志中看到默认密码

进行简单的配置

建立一个类继承WebSecurityConfigurerAdapter就可以进行配置

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //配置一些权限
        http.authorizeRequests().
            antMatchers("/login").permitAll().antMatchers("/").permitAll()
        	.antMatchers("/vip1").hasRole("vip1")
            .antMatchers("/vip2").hasRole("vip2")
            .antMatchers("/vip3").hasRole("vip3");
        //这句话是生成登录界面
        http.formLogin();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .passwordEncoder(new BCryptPasswordEncoder())
            .withUser("lucas").password(new BCryptPasswordEncoder()
            .encode("123456")).roles("vip1","vip2");
    }
}

登录配置

@Override
protected void configure(HttpSecurity http) throws Exception {
    //配置一些权限
    http.authorizeRequests().//开启登录配置
        antMatchers("/index").permitAll().antMatchers("/").permitAll()
        .antMatchers("/vip1").hasRole("vip1")
        .antMatchers("/vip2").hasRole("vip2")
        .antMatchers("/vip3").hasRole("vip3");
    //这句话是生成登录界面
    http.formLogin();
}

这个重写了configure方法,配置一些访问权限

authorizeRequests()开启了登录配置

  1. antMatchers("/index").permitAll()这段代码配置了/index可以被所有人访问
  2. antMatchers("/vip1").hasRole("vip1")这段代码配置类/vip1可以被有vip1角色的用户访问
  3. http.formLogin()这句话生成了登录界面

用户设置

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
        .passwordEncoder(new BCryptPasswordEncoder())
        .withUser("lucas").password(new BCryptPasswordEncoder()
        .encode("123456")).roles("vip1","vip2");
}
  1. inMemoryAuthentication()是在内存中设置

  2. passwordEncoder(new BCryptPasswordEncoder())这非常重要,新版本中一定要使用密码编码器

  3. withUser("lucas").password(new BCryptPasswordEncoder().encode("123456"))设置用户名和密码

  4. roles("vip1","vip2")设置角色

这样基本的访问控制就配置好了

登出

http.logout()配置了登出,访问/logout,注销完的页面也可以配置

.logoutUrl("/")当然还有清除Cookies和Session

csrf 攻击配置

http.csrf().disabled

记住我功能

http.rememberMe()