在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),它有三个参数,分 别是用户名、密码和权限集(角色集)。
案例:
此案例里面用户名,密码角色都是写死的 没有从数据库查询
此案例的用户有admin和user,其中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)