当前位置:   article > 正文

jwt实现oauth2.0 java_SpringSecurity实现OAuth2+JWT

$2a$10$ 加密

一、基本概念

1.1 认证方式

1.1.1 基于session方式认证

他的流程是:用户认证成功后,服务端生成相应的用户数据保存在session中,发给客户端的session_id保存在cookie中。这样用户请求时只要带上session_id就可以验证服务端是否存在session,以此完成用户的校验。当用户退出系统或session过期时,客户端的session_id也就无效了。

1.1.2 基于token认证方式

他的流程是:用户认证成功后,服务端生成一个token发给客户端,客户端放到cookie或localStorage等存储中,每次请求带上token,服务端收到后就可以验证。

1.2 什么是授权

授权:用户认证通过后根据用户的权限来控制用户访问资源的过程。

1.3 权限模型

最简单权限表设计。

5536ce723ee75814d63372b95eb6f1f7.png

二、快速入门

2.1 用户认证

先自行搭建一个SpringMvc或者SpringBoot项目.

2.1.1 引入依赖

org.springframework.boot

spring-boot-starter-security

2.1.2 配置类

@EnableWebSecurity

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

/**

* 配置用户信息服务

* @return

*/

@Bean

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

.antMatchers("/r/**").authenticated()

.anyRequest().permitAll()

.and()

.formLogin()

.successForwardUrl("/login-success");

}

}

2.1.3 测试资源访问

写一个controller进行测试.

@RestController

public class ResourceController {

@RequestMapping("/r/r1")

public String r1(){

return "访问资源1";

}

@RequestMapping("/r/r2")

public String r2(){

return "访问资源2";

}

}

直接访问http://localhost:8080/r/r2,会跳到登陆页面,登陆成功后访问则成功.

以上就利用SpringSecurity完成来了认证功能.

2.2 资源控制

只需在antMatchers("/r/r1").hasAnyAuthority("p1")方法上加上hasAnyAuthority就可以了.

这个方法代表要访问/r/r1,必须得有p1权限.

@Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.antMatchers("/r/r1").hasAnyAuthority("p1")

.antMatchers("/r/r2").hasAnyAuthority("p2")

.anyRequest().permitAll()

.and()

.formLogin()

.successForwardUrl("/login-success");

}

注意:规则的顺序很重要,具体的规则要放在最上面,permitAll这种放在下面

三、工作原理

Spring Security对资源对保护是通过filter来实现对,当初始化Spring Security时,会创建一个名为SpringSecurityFilterChain的Servlet过滤器,类型为FilterChainProxy,他实现了javax.servlet.Filter接口,因此外部的请求会经过此类.

0da1b8657964feeeb6dd4112b4ca0684.png

SpringSecurity的功能主要是通过过滤器链来完成的.

下面介绍几个主要的拦截器:

SecurityContextPersistenceFilter:整个拦截过程的入口和出口

UsernamePasswordAuthenticationFilter:用于处理来自表单提交的认证

FilterSecurityInterceptor:用于保护web资源的

ExceptionTranslationFilter:能够捕获FilterChain的所有异常并处理.

认证过程:

3427d0269ff22daff7b5fc97ed789850.png

3.1 改为从数据库查询用户

实现UserDetailsService接口

@Service

public class MyUserDetailService implements UserDetailsService {

@Override

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

//这里可以写从数据库查的逻辑

UserDetails userDetails = User.withUsername(username).password("123").authorities("p1").build();

return us

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/932668
推荐阅读
相关标签
  

闽ICP备14008679号