天天看点

Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面

Spring Boot Security

1、集成Spring Security

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

2、前端页面的简单编写

Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面
<body>
<a href="level1/1">level1:1</a>
<a href="level1/2">level1:2</a>
<a href="level1/3">level1:3</a>
<br>
<hr>
<a href="level2/1">level2:1</a>
<a href="level2/2">level2:2</a>
<a href="level2/3">level2:3</a>
<br>
<hr>
<a href="/logout">注销</a>
</body>
           
Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面

3、控制器实现页面跳转

@Controller
public class SecurityController {

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

    @RequestMapping("/level1/{id}")
    public String level1(@PathVariable("id") Integer id){
        return "level1/level"+id;
    }
    @RequestMapping("/level2/{id}")
    public String level2(@PathVariable("id") Integer id){
        return "level2/level"+id;
    }
}
           

4、注册Spring Security安全权限

//开启安全权限(交给spring托管了)
@EnableWebSecurity
//注册一个安全权限
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	//重写授权与认证的方法
}
           

5、重写授权方法

@Override
//授权(哪些角色可以访问哪些页面)
protected void configure(HttpSecurity http) throws Exception {
    //首页所有人可以访问,功能页只有对应权限的人才能访问
    //添加请求授权规则
    http.authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/level1/**").hasRole("vip1")
            .antMatchers("/level2/**").hasRole("vip2")
            .antMatchers("/level3/**").hasRole("vip3");

    //没有权限时,默认到登录页面,默认的url是/login
    http.formLogin();
    /*注销,注销页面的默认url是/logout;注销后跳转到首页*/
    http.logout().logoutSuccessUrl("/");
    //开启记住我功能(cookie的原理,默认保存两周)
    http.rememberMe();
}
           

6、重写认证方法

/*
* 认证
* 若登录后出现:There is no PasswordEncoder mapped for the id "null" 500错误
* spring security 5.0+  登录的密码必须被加密,需要添加加密方式  xxxPasswordEncoder
* */
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
   //正常情况下,这些用户认证是通过数据库中读取
   //从内存中读取认证(可以添加多个用户认证,使用密码加密;用and方法进行分隔)
   auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
           .withUser("maki").password(new BCryptPasswordEncoder().encode("123")).roles("vip1")
           .and()
           .withUser("root").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2");
}
           

实现对应角色用户,只显示对应页面

1、thymeleaf与spring security的整合

<!--security与thymeleaf的整合-->
<dependency>
   <groupId>org.thymeleaf.extras</groupId>
   <artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
           

2、thymeleaf中引入约束

<html lang="en"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
           

3、若未登录,只显示登录

<!--
    若未登录,显示登录
    判断用户是否已认证
-->
<div sec:authorize="!isAuthenticated()">
    <a  th:href="@{/login}">登录:security的默认登录页</a>
    <br>
</div>
           

4、若已登录显示用户名、注销、以及对应角色所对应的页面

<!--
    若已登录,显示用户名、注销、对应角色显示的对应页
    判断用户是否已认证
-->
<div sec:authorize="isAuthenticated()">
    <!--身份认证:获取用户名,角色-->
    用户名:<span sec:authentication="name"></span>
    角色:<span sec:authentication="principal.authorities"></span>
    <a href="/logout">注销:security的默认注销页</a>
    <br>
    <!--VIP1用户,显示的页面-->
    <div sec:authorize="hasRole('vip1')">
        <a href="level1/1">level1:1</a>
        <a href="level1/2">level1:2</a>
        <a href="level1/3">level1:3</a>
        <br>
    </div>
    <!--VIP2用户,显示的页面-->
    <div sec:authorize="hasRole('vip2')">
        <a href="level2/1">level2:1</a>
        <a href="level2/2">level2:2</a>
        <a href="level2/3">level2:3</a>
        <br>
    </div>
</div>
           

效果图

1、未登录状态

Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面

2、security自带的登录页

Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面

3、使用maki账户(VIP1权限)登录

Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面

4、使用root账户(所有权限)登录

Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面

5、security自带的注销页

Spring Boot 笔记(Security)Spring Boot Security实现对应角色用户,只显示对应页面效果图自定义security的登录、登录失败、注销页面

自定义security的登录、登录失败、注销页面

1、注册spring security,开启安全权限,添加授权

//开启安全权限(交给spring托管了)
@EnableWebSecurity
//注册一个安全权限
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    //授权(哪些角色可以访问哪些页面)
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人可以访问,功能页只有对应权限的人才能访问
        //添加请求授权规则
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2");

        /*
       		没有权限时,默认到登录页面,使用自定义的登录页
       		如何获取自定义登录页的表单数据?
       		security默认接受的表单数据的参数name是:username&password
        */
        http.formLogin().loginProcessingUrl("/toLogin")
        .usernameParameter("user")
        .passwordParameter("pwd");
        
        /*注销,注销页面的默认url是/logout;注销后跳转到首页*/
        http.logout().logoutSuccessUrl("/");
        
        /*
	        开启记住我功能(cookie的原理,默认保存两周)
	        若使用自定义登录页,需要指定记住我checkbox标签的name值
        */
        http.rememberMe().rememberMeParameter("remember");
    }