SpringSecurity、OAuth2.0、JWT、Dubbo和Swagger2集成和使⽤说明1、Spring Security
1.1 框架介绍
Spring Security,这是⼀种基于 Spring AOP 和 Servlet 过滤器的安全框架。它提供全⾯的安全性解决⽅案,同时在 Web 请求级和⽅法调⽤级处理⾝份确认和授权。
1.2 配置说明
1.2.1 maven 集成
<!--==========security dependency ==============-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
1.2.2 WebSecurityConfig
@Configuration
@EnableWebSecurity //开启WebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* ⾃定义⽤户服务类,⽤于⽤户名、密码校验,权限获取
*/
@Resource(name = "userDetailsService")
private UserDetailsService userDetailsService;
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
/**
* 安全拦截机制
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.requestMatchers().anyRequest()
.
and()
.authorizeRequests()
.antMatchers("/oauth/**").permitAll() //oauth下的所有⽅法,⽆须认证
.and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());
}
/**
* 密码加密策略
* @return
*/
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}springboot aop
1.2.3 UserServiceImpl
⾃定义⽤户服务类,继承UserDetailsService,重写loadUserByUsername ⽅法,根据⾃⾝业务修改代码
@Service(value = "userDetailsService")
public class UserServiceImpl implements UserDetailsService {
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 这⾥需要写根据⽤户名查询⽤户逻辑。。。。。。
UserDTO user = new UserDTO();
user.setUserId("1");
user.setUsername("admin");
user.setMobile("188103956897");
user.setStatus(6);
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
UserDTO userDTO = new UserDTO();
// 为了增强jwt令牌内容,可以将整个对象转json存放到username中
userDTO.JSONString(user));
// userDTO.setUsername("admin");
userDTO.de("123"));
return userDTO;
}
}
1.2.4 UserDTO
配合UserServiceImpl使⽤,返回⽤户对象
@Getter
@Setter
public class UserDTO implements UserDetails {
private String userId;
private String username;
private String password;
private String mobile;
private String realName;
private String companyId;
private Integer status;
public UserDTO() {
}
public UserDTO(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
2、OAuth2.0
2.1 框架介绍
OAuth 2.0是⽬前最流⾏的授权机制,⽤来授权第三⽅应⽤,获取⽤户数据。
允许⽤户授权第三⽅⽹站访问他们存储在另外的服务提供者上的信息,⽽不需要将⽤户名和密码提供给第三⽅⽹站或分享他们数据的所有内容
2.1.1 四种授权⽅式
授权码(authorization-code)
常⽤遇到的场景就是其他软件登录的时候,不想注册账户,可以选择⽤QQ、等⽅式进⾏登录,这个时候不需要输⼊账户、密码。
⽽是需要扫描,在QQ或者中进⾏确认即可
是最复杂、最安全的授权⽅式
1、先获取授权码
2、根据授权码再去申请token
简化模式(implicit)
常⽤于单页⾯应⽤,没有复杂的后台,直接通过url形式获取token
密码式(password)
常⽤于内部系统,完全可以信任的情况,根据⽤户名、密码获取token
客户端凭证(client credentials)
最简单最不安全的⽅式,根据客户端id、授权密码就可以获取token
2.1.2 JWT令牌
JSON Web Token(JWT)是⼀个开放的⾏业标准(RFC 7519),它定义了⼀种简介的、⾃包含的协议格式,⽤于在通信双⽅传递json 对象,传递的信息经过数字签名可以被验证和信任。JWT可以使⽤HMAC算法或使⽤RSA的公 钥/私钥对来签名,防⽌被篡改
优点
1、jwt基于json,⾮常⽅便解析。
2、可以在令牌中⾃定义丰富的内容,易扩展。
3、通过⾮对称加密算法及数字签名技术,JWT防⽌篡改,安全性⾼。
4、资源服务使⽤JWT可不依赖认证服务即可完成授权。
缺点
1、JWT令牌较长,占存储空间⽐较⼤。
2.2 配置说明
2.2.1 maven 集成
<!--==========security-oauth2 dependency ==============-->
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>1.1.0.RELEASE</version>
</dependency>
2.2.2 授权服务配置
/**
* 开启授权服务器
*/
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
/**
* 指定哪些资源是需要授权验证的
*/
private static final String RESOURCE_ID = "ALL";
/**
* 设置jwt加密key
*/
private static final String JWT_SIGNING_KEY = "jwt_MC43A6m0Xt9jUIV";
/**
* 认证⽅式
*/
@Autowired
private AuthenticationManager authenticationManager;
/**
* ⾃定义⽤户服务
*/
@Resource(name = "userDetailsService")
private UserDetailsService userDetailsService;
// @Autowired
// private CustomWebResponseExceptionTranslator customWebResponseExceptionTranslator;
/**
* 配置客户端对应授权⽅式及客户端密码
* 当前使⽤内存模式
* @param configurer
* @throws Exception
*/
@Override
public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {
// ⽤ BCrypt 对密码编码
String secret = new BCryptPasswordEncoder().encode("MC43A6m0Xt9jUIV");
//配置1个客户端,⼀个⽤于password认证
configurer.inMemory() // 使⽤in-memory存储
.withClient("weixin") //client_id⽤来标识客户的Id 客户端1
.resourceIds(RESOURCE_ID)
.authorizedGrantTypes("password", "refresh_token") //允许授权类型密码授权模式
.scopes("read","write") //允许授权范围
.
authorities("oauth2") //客户端可以使⽤的权限
.secret(secret) //secret客户端安全码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论