Spring bootSecurity安全框架

举报
tea_year 发表于 2022/03/29 11:35:40 2022/03/29
【摘要】 在web开发中安全是第一位的!在于安全方面的话我们学过什么?-- 过滤器 --拦截器那么我们说,安全是不是一个功能型需求?答案是: 否 安全的重要性: 那么我们去做网站或者是做后台,安全在什么时候考虑?那么我们来考虑一下,我们开发的网站又漏洞的话,或者是隐私泄露可以么?假设架构一旦确定,我们还好去增加一些安全的东西么?所以说,安全问题应该是在做网站的设计之初就应该考虑的问题。 关于安全的框架...

在web开发中安全是第一位的!在于安全方面的话我们学过什么?

-- 过滤器 --拦截器

那么我们说,安全是不是一个功能型需求?

答案是: 否

安全的重要性:

那么我们去做网站或者是做后台,安全在什么时候考虑?

那么我们来考虑一下,我们开发的网站又漏洞的话,或者是隐私泄露可以么?

假设架构一旦确定,我们还好去增加一些安全的东西么?

所以说,安全问题应该是在做网站的设计之初就应该考虑的问题。

关于安全的框架,shiro Security这两个是目前很知名的安全框架

主要功能:

认证:就是用户登录的时候,检验用户的信息是否正确

授权:就是字面的意思,就像是每个用户又那些权限(vip1,vip2)

这些功能原来我们在实现的时候,需要在拦截器中写大量的代码,现在就是有可能一两行代码就可以实现了,这就是使用框架的好处

权限的区分?

功能权限

访问权限

菜单权限

等等,这些功能,我们以前都是使用拦截器甚至是过滤器做的是吧?

这就需要使用大量的原生代码。。。-----冗余



如何使用security安全框架?

加jar

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-security</artifactId>

</dependency>


设置谷歌浏览器的无痕模式 ctrl+shift+n

加上安全框架以后需要

输入用户名和密码:

默认用户名 user

密码 在项目启动的时候控制台输出一串字符串

Using generated security password: 6673481e-93a0-417b-bc6f-44a6d2d42974




设置用户名和密码

在properties文件中配置

spring.security.user.name=root
spring.security.user.password=root

设置玩用户名和密码之在登录的时候就填写这个用户名和密码即可


添加springboot-security访问配置

自定义表单登录

如果不直接使用框架自带的html页面的话,就需要我们配置页面比如:使用jsp,或者使用thymeleaf

使用jsp

需要添加jsp需要的jar包

<!-- 支持跳转jsp页面 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.12</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.1</version>
</dependency>


在配置文件中配置

#配置前缀后缀
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp


我们可以直接使用html

添加securityConfig配置类

配置的时候需要注意事项:

1. 加上@Confifiguration @EnableWebSecurity注解

2. 继承 WebSecurityConfifigurerAdapter

3. 代码如下:

.anyRequest()

.authenticated(

是对http所有的请求必须通过授权认证才可以访问。

http.authorizeRequests()其中这里的意思是指通过authorizeRequests()方法来开始请求权限配置。即每个子匹配 器将会按照声明的顺序起作用。

package com.aaa.springbootsecurity.com.aaa.config;

import org.springframework.context.annotation.Configuration;
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;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated()
.and()
.formLogin() //指定支持基于表单的身份验证
.loginPage("/login") //默认的登录路径
.loginProcessingUrl("/loginCheck")//登录页面提交的路径,需要和页面的路径保持一致
.defaultSuccessUrl("/logSuccess")//登录成功后跳转的路径
.failureUrl("/error2")//登录失败后跳转的路径
//.usernameParameter("username")//获取页面的配置的用户名,和页面的值保持一致
//.passwordParameter("password")
.permitAll()//路径不舍权限
.and()
.csrf().disable();//阻止跨域请求伪造攻击




}
}


创建页面

创建controller

package com.aaa.springbootsecurity.com.aaa.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class Test {
@RequestMapping("/login")
public String login(){
return "login";
}
@RequestMapping("/logSuccess")
public String logSuccess(){
System.out.println("aaa");
return "success";
}


@RequestMapping("/error2")
public String error111(){
return "error1";
}
}


设置有权限的访问:

认证用户和用户的权限

自定义UserDetailsService,将用户信息和权限注入进来。重写loadUserByUsername方法,参数是用户输入的用 户名。

返回值是UserDetails,这是一个接口,

一般使用它的子类 org.springframework.security.core.userdetails.User(当前你也可以自定义UserDetails),它有三个参数,分 别是用户名、密码和权限集(角色集)。

案例:

此案例里面用户名,密码角色都是写死的 没有从数据库查询

此案例的用户有adminuser,其中admin用户的密码是admin角色是admin

user用户的密码是user角色是user

package com.aaa.springbootsecurity.com.aaa.service;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collection;

@Service
//这里实现UserDetailsService是安全框架的类
public class UserDetaileServiceImpl implements UserDetailsService {

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Collection<GrantedAuthority> authorities = new ArrayList<>();
//判断用户是否存在
if(!username.equals("admin")&&!username.equals("user")){
//用户不存在
System.out.println("用户不存在");
throw new UsernameNotFoundException("用户不存在");
}

//添加 用户的juese
if(username.equals("admin")){
//用户存在的话开始添加权限
authorities.add(new SimpleGrantedAuthority("admin"));
User user = new User("admin", "admin", authorities);
return user;
}else{
authorities.add(new SimpleGrantedAuthority("user"));
User user= new User("user","user",authorities);
return user;
}
}





}


修改配置类,让角色可以访问不同路径,验证密码是不是正确

package com.aaa.springbootsecurity.com.aaa.config;

import com.aaa.springbootsecurity.com.aaa.service.UserDetaileServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
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.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
UserDetaileServiceImpl userDetaileService;

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
//设置以/user为开头的路径只能由角色为User的用户访问
.antMatchers("/user/*").hasAnyAuthority("user")
//设置以/admin开头的url,只能由角色为admin的用户访问
.antMatchers("/admin/*").hasAnyAuthority("admin")
.antMatchers("/comm").permitAll()//所有登录成功的用户都能访问
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/loginCheck")
.defaultSuccessUrl("/logSuccess")
.failureUrl("/error2")
.usernameParameter("username")
.passwordParameter("password")
.permitAll()
.and()
.csrf().disable();



}
//重写这个方法是为了验证密码是不是正确
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//super.configure(auth);
auth.userDetailsService(userDetaileService).passwordEncoder(new PasswordEncoder() {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}

@Override
public boolean matches(CharSequence charSequence, String s) {
return s.equals(charSequence.toString());
}
});
}
}



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。