SpringBoot-搭建SpringSecurity(保姆级别)

public String toLogin(){

return “views/login”;

}

@RequestMapping(“/level1/{id}”)

public String level1(@PathVariable(“id”) int id){

return “views/level1/”+id;

}

@RequestMapping(“/level2/{id}”)

public String level2(@PathVariable(“id”) int id){

return “views/level2/”+id;

}

@RequestMapping(“/level3/{id}”)

public String level3(@PathVariable(“id”) int id){

return “views/level3/”+id;

}

}

4.测试以上步骤是否成功

启动项目

首页:

登录页:

成功!

但我们目前是可以任意对level1~level3进行随意访问的,接着我们要做的就是只有相应权限的人才可以进行访问

3. 增加上认证和授权的功能

==============

(1)导入Security依赖:

org.springframework.boot

spring-boot-starter-security

(2)编写 Spring Security 配置类

重写WebSecurityConfigurerAdapter的两个配置方法:

configure(HttpSecurity http):定制请求的授权规则

configure(AuthenticationManagerBuilder auth):定义认证规则

package com.yixin.demo.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;

import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@EnableWebSecurity// 开启WebSecurity模式

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

.antMatchers(“/level3/**”).hasRole(“vip3”);

// 开启自动配置的登录功能

// /login 请求来到登录页,如果没有指定默认登录界面,则会采用Security的默认登录界面

// /login?error 重定向到这里表示登录失败

http.formLogin();

}

//定义认证规则

@Override

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

//在内存中定义,也可以在jdbc中去拿…

//Spring security 5.0中新增了多种加密方式,也改变了密码的格式。

//要想我们的项目还能够正常登陆,需要修改一下configure中的代码。我们要将前端传过来的密码进行某种方式加密

//spring security 官方推荐的是使用bcrypt加密方式。

auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())

.withUser(“yixin”).password(new BCryptPasswordEncoder().encode(“123456”)).roles(“vip2”,“vip3”)

.and()

.withUser(“root”).password(new BCryptPasswordEncoder().encode(“123456”)).roles(“vip1”,“vip2”,“vip3”)

.and()

.withUser(“guest”).password(new BCryptPasswordEncoder().encode(“123456”)).roles(“vip1”,“vip2”);

}

}

(3)此时我们再重新尝试启动

我们点击Level2。

发现进入了SpringSecurity的默认登录界面,注意该界面并不是我们自定义的

我们输入以下信息:

user: yixin

pwd: 123456

我们对yixin这个用户给予的权限是vip2和vip3,也就是说yixin可以访问level2和level3,但是访问不了level1;

我们进行测试:

level2测试:

登录:

Level2目录下的页面可以成功进入。

测试level1目录:

点击:

可以发现我们无法访问level1目录下的静态资源,因为我们没有给yixin用户设置相应的权限

4.权限控制和注销

=========

(1)主页面index.html增加一个注销的按钮

注销

(2)开启自动配置的注销的功能

//定制请求的授权规则

@Override

protected void configure(HttpSecurity http) throws Exception {

//…

//开启自动配置的注销的功能

// /logout 注销请求

http.logout();

}

测试:

登录成功后点击注销

点击注销后会出来一个提示

点击log out,就会跳转到登录界面。

如果我们想让他注销成功后,依旧可以跳转到首页,应进行如下处理:

// .logoutSuccessUrl(“/”); 注销成功来到首页

http.logout().logoutSuccessUrl(“/”);

测试成功!注销后跳转到首页。

5.开启“记住我”功能

===========

现在的情况,我们只要登录之后,关闭浏览器,再进入网页,就会让我们重新登录,但是我们要实现的是当我们在该网站登录过一次,接着关闭网页,下一次进入该网站就不需要再进行登录了。

(1)SpringSecurity开启“记住我”配置:

protected void configure(HttpSecurity http) throws Exception {

//…

//开启记住我功能: cookie,默认保存两周,自定义接收前端的参数

http.rememberMe();

}

(2)启动项目测试

可以发现,这里多了一个Remember的标记

我们登录之后关闭 浏览器,然后重新打开浏览器访问,可以发现访问不需要登录了。

我们去查看一下浏览器的cookie,可以发现它的默认保存时间是14天

我们点击注销的时候,可以发现,spring security 帮我们自动删除了这个 cookie

(3)原理

cookie发送给浏览器保存,以后登录带上这个cookie,只要通过检查就可以免登录了。如果点击注销,则会删除这个cookie。

6.实现两个需求

========

(1_)用户没有登录的时候,导航栏上只显示登录按钮,用户登录之后,导航栏可以显示登录的用户信息及注销按钮。_

(2)根据用户的权限,显示相应的页面,如yixin这个用户,它只有 vip2,vip3功能,那么登录则只显示这两个功能,而vip1的功能菜单不显示。

(1)导入依赖

org.thymeleaf.extras

thymeleaf-extras-springsecurity5

3.0.4.RELEASE

  • 整合包4(springsecurity4)——springboot版本2.0.9

  • 整合包5(springsecurity5)——springboot版本之后

(2)thymeleaf的功能

sec:authorize=“isAuthenticated()”:是否认证登录!来显示不同的页面

(3)实现需求一

index.html

登录

用户名:

角色:

注销

启动项目

未登录:

登录过后:

(4)点击注销产生的问题

  • 整合包4(springsecurity4)

image-20200728220414292

  • 整合包5(springsecurity5)(不算问题,需要点击确定,才能回到首页)

image-20200728220517534

解决问题:

  • 它默认防止csrf跨站请求伪造,因为会产生安全问题

  • 将请求改为post表单提交

  • 在spring security中关闭csrf功能

http.csrf().disable();

再次点击注销按钮之后(直接退出到首页

(5)实现需求二

Level 1

Level-1-1
Level-1-2
Level-1-3
Level 2

Level-2-1
Level-2-2
Level-2-3
Level 3

Level-3-1
Level-3-2
Level-3-3

测试

未登录:

用户登录:

成功实现需求!

7.自定义登录界面

=========

(1)主界面index中指定login请求

登录

(2)配置login.html登录的信息发送到哪里

注意:login.html 配置提交请求及方式,方式必须为post:

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
:href=“@{/toLogin}”>

登录

(2)配置login.html登录的信息发送到哪里

注意:login.html 配置提交请求及方式,方式必须为post:

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-izmtdOQ2-1715070165166)]

[外链图片转存中…(img-YGBYemS2-1715070165166)]

[外链图片转存中…(img-fgXDDKPz-1715070165167)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值