SpringBoot-Security 使用

Posted liangliang_f

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot-Security 使用相关的知识,希望对你有一定的参考价值。

功能:解决web站点的登录,权限验证,授权等功能

优点:在不影响站点业务代码,可以权限的授权与验证横切到业务中

1、要添加的依赖

 1     <!--thymeleaf-->
 2         <dependency>
 3             <groupId>org.springframework.boot</groupId>
 4             <artifactId>spring-boot-starter-thymeleaf</artifactId>
 5         </dependency>
 6         <!--security 和 thymeleaf 整合包-->
 7         <dependency>
 8             <groupId>org.thymeleaf.extras</groupId>
 9             <artifactId>thymeleaf-extras-springsecurity5</artifactId>
10         </dependency>
11         <!--web-->
12         <dependency>
13             <groupId>org.springframework.boot</groupId>
14             <artifactId>spring-boot-starter-web</artifactId>
15         </dependency>
16         <!--security-->
17         <dependency>
18             <groupId>org.springframework.boot</groupId>
19             <artifactId>spring-boot-starter-security</artifactId>
20         </dependency>

2、Security 下授权与验证的简单配置(Security下有登录,注销,记住我等功能,可以快速集成到自己的login页上)

Tis:如果template页中使用了 Frame页,默认是不能访问的,需要添加 http.headers().frameOptions().sameOrigin();
 1 @EnableWebSecurity
 2 public class SecurityConfig extends WebSecurityConfigurerAdapter {
 3     //授权
 4     @Override
 5     protected void configure(HttpSecurity http) throws Exception {
 6 
 7         //请求授权的规则
 8         http.authorizeRequests()
 9                 //.antMatchers("/tologin").permitAll() //登录页所有人都可以访问
10                 //.antMatchers("/admin/**").hasRole("admin1")
11                 .antMatchers("/admin/list").hasRole("admin1")
12                 .antMatchers("/admin/role").hasRole("admin1")
13                 .antMatchers("/admin/cate").hasRole("admin2")
14                 .antMatchers("/admin/rule").hasRole("admin2");
15 
16         // 项目里面使用了springSecurity spring Security下,X-Frame-Options默认为DENY,非spring Security环境下,X-Frame-Options的默认大多也是DENY,这种情况下,浏览器拒绝当前页面加载任何Frame页面
17         http.headers().frameOptions().sameOrigin();
18 
19         //登录页(Security默认有一个登录页)
20         http.formLogin().permitAll()
21                 .loginPage("/tologin") //指定自定义的登录页地址
22                 .successForwardUrl("/admin/index") //登录成功跳转地址
23                 .usernameParameter("username").passwordParameter("password");//匹配自定义登录页的name元素名称
24 
25         // 开启注销功能,跳转到登录页
26         http.csrf().disable(); //退出失败可能能的原因
27         http.logout().logoutSuccessUrl("/tologin");
28 
29         //开启记住我功能,cookie 默认保存14天
30         http.rememberMe()
31                 .rememberMeParameter("remember");//匹配自定义登录页的name元素名称
32 
33     }
34 
35     //认证
36     @Override
37     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
38         auth.inMemoryAuthentication()
39                 .passwordEncoder(new BCryptPasswordEncoder())//密码加密方式(有些版本的Security必须要指定)
40                 .withUser("root").password(new BCryptPasswordEncoder().encode("123")).roles("admin1","admin2","admin3")
41                 .and()
42                 .withUser("yeqiu").password(new BCryptPasswordEncoder().encode("123")).roles("admin1")
43                 .and()
44                 .withUser("admin").password(new BCryptPasswordEncoder().encode("123")).roles("admin2");
45 
46     }
47 }

 

3、Security 和 Thymeleaf 页面整合(添加依赖:thymeleaf-extras-springsecurity)

<!--加入约束-->
<html class="x-admin-sm" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">

<!--
    sec:authorize="isAuthenticated()" 用户是否登录
    sec:authorize="hasAnyRole(‘admin1‘)" 是否具有某个角色
    sec:authentication="name" 当前登录用户
    sec:authentication="principal.authorities" 当前用户全部角色
-->

<div sec:authorize="isAuthenticated()">
    <h2><span sec:authentication="name"></span>,您好 您的身份是
        <span sec:authentication="principal.authorities"></span>
    </h2>
</div>

<li sec:authorize="hasRole(‘admin2‘)">
      <a onclick="xadmin.add_tab(‘权限管理‘,‘admin/rule‘)">
            <cite>权限管理</cite>
      </a>
</li> 

 

以上是关于SpringBoot-Security 使用的主要内容,如果未能解决你的问题,请参考以下文章

SpringBootSecurity学习(09)网页版登录配置Session共享

Android Adapter代码片

代码片|水波纹

完成一个简单的时间片轮转多道程序内核代码

57 java编程思想——创建窗口和程序片 可视编程和Beans

代码片--练习匿名内部类