一、基本概念?
1、认证:确定使用者是否有权限,判断身份是否合法,基于用户名密码、二维码、短信验证码等
2、会话:为了避免用户每次操作都认证,让用户在登录一次后创建一个会话,在特定时间内,就不需要认证了,基于session、token等
3、授权:使用者是否对资源拥有权限,控制不同用户访问不同资源
授权的数据模型
简单理解为Who对What进行How操作。Who:主题、What:资源、How:权限(数据、功能)。
RBAC?
- 基于角色的访问:判断主体是否有某些角色,当角色改变,可能要修改
- 基于资源的访问:判断主体是否有访问资源的权限
二、基于Session的认证方式
1、认证流程:采用servlet规范,认证成功后,服务端给客户端返回sessionId,客户端存放到cookie中。
2、认证方式就是简单的流程登陆、采用过滤器进行权限方式拦截
三、基于String Security
1、spring security 提供了拦截器,用于权限校验,需要在配置文件或者配置类中进行配置
2、spring security 提供了登陆(login)、退出登陆(logout)页面,都是可以自定义的
3、spring security 提供了用户校验的功能,但是需要开发者提供一个UserDetailsService,主要作用就是给spring security返回用户信息,让其进行校验,同时定义密码编译器?4、初始化spring security 环境
5、spring security 授权,无权限返回都是403
四、spring boot 集成 spring security
只要引入,即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
简单的配置类:
package com.example.demo.conf;
import org.springframework.context.annotation.Bean;
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;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
/**
* spring security configuration
*/
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
@Override
public UserDetailsService userDetailsService(){
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//在内存中创建几个用户,正常应该自己些
manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());
manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build());
return manager;
}
/**
* 密码的编码方式
* @return
*/
@Bean
public PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
/**
* 一些简单权限配置
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
//访问 /r/r1 的用户必须有p1 权限
.antMatchers("/r/r1").hasAnyAuthority("p1")
//访问 /r/r2 的用户必须有p2 权限
.antMatchers("/r/r2").hasAnyAuthority("p2")
//所有的 /r开头的请求都进行权限验证
.antMatchers("/r/**").authenticated()
//都放行
.anyRequest().permitAll()
.and()
//登陆可以使用表单提交
.formLogin()
//成功后跳转的地址
.successForwardUrl("/login-success");
}
}
|