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

一、基本概念

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security是一个功能强大的安全框架,用于在Java应用程序中实现身份验证和授权。JWT(JSON Web Token)是一种轻量级的身份验证和授权机制,其中包含了验证用户身份的加密信息。OAuth 2.0是一种开放标准的授权协议,它允许用户授权第三方应用程序访问受保护的资源。 Spring Security可以与JWTOAuth 2.0结合使用,以提供更强大的身份验证和授权功能。使用JWT作为身份验证机制,可以在用户登录成功后生成一个JWT令牌,并将其加入到HTTP请求的Header中。服务端可以使用JWT中的信息,如用户名和权限,对请求进行验证,确保用户的身份是有效的。而OAuth 2.0允许用户通过授权服务器颁发的token来访问受保护的资源,Spring Security可以集成OAuth 2.0来实现授权验证的逻辑。 通过使用Spring Security结合JWTOAuth 2.0,可以轻松实现可伸缩、安全的身份验证和授权机制。开发人员可以使用Spring Security提供的各种功能,如用户认证、角色授权和访问控制,来保护应用程序中的敏感操作和数据。此外,使用JWTOAuth 2.0,可以实现无状态的API身份验证和授权,提高系统的可扩展性和性能。 总之,Spring SecurityJWTOAuth 2.0的结合为应用程序提供了安全、可靠的身份验证和授权机制。开发人员可以根据具体的需求配置和使用这些功能,以保护应用程序的安全和数据的机密性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值