微服务迁移记(五):WEB层搭建(2)-SpringSecurity集成
一、redis搭建
二、WEB层主要依赖包
三、FeignClient通用接口
以上三项,参考《微服务迁移记(五):WEB层搭建(1)》
接下来,集成SpringSecruity,实现用户登录。
总体思路为:自定义UserDetails、UserDetailsService,重载WebSecurityConfigurerAdapter实现自定义表单登录,将菜单和按钮权限也扔到SpringSecruity的Session里。
四、SpringSecurity集成
1. 自定义MyUserDetails,实现UserDetails接口
1)我在里面多定义了一个UserEntity实体,通过get方法可以拿到这个实体,实现前台的一些业务逻辑。
RoleTreefuncEntity是功能权限树,也扔到session里。
2)isAccountNonExpired、isAccountNonLocked、isCredentialsNonExpired、isEnabled这几个方法,因为我直接从用户表取 del_flag=0的用户,不判断用户禁用或过期等状态,都直接返回true了。
package com.zyproject.web.secrity; import com.zyproject.entity.RoleTreefuncEntity;
import com.zyproject.entity.UserEntity;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails; import java.util.Collection;
import java.util.List; /**
* @program: zyproject
* @description: 实现SpringSercrity UserDetails
* @author: zhouyu(zhouyu629 # qq.com)
* @create: 2020-02-12
**/
public class MyUserDetails implements UserDetails { private UserEntity userEntity; //用户实体
//将用户所有的角色菜单权限放到内存中,供校验使用
private List<RoleTreefuncEntity> roleTreefuncEntities; public MyUserDetails(UserEntity userEntity,List<RoleTreefuncEntity> roleTreefuncEntities){
this.userEntity = userEntity;
this.roleTreefuncEntities = roleTreefuncEntities;
} //获取用户真实姓名
public String getRealName(){
return userEntity.getUser_name();
} //获取用户实体
public UserEntity getUserEntity(){
return this.userEntity;
} //获取权限菜单
public List<RoleTreefuncEntity> getTreefuncEntities(){return this.roleTreefuncEntities;} @Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
} @Override
public String getPassword() {
return userEntity.getLogin_password();
} @Override
public String getUsername() {
return userEntity.getLogin_code();
} @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. 自定义MyUserDetailsService接口,实现UserDetailsService接口
package com.zyproject.web.secrity; import com.google.gson.Gson;
import com.zyproject.common.CodeEnum;
import com.zyproject.common.ResponseData;
import com.zyproject.entity.RoleTreefuncEntity;
import com.zyproject.entity.UserEntity;
import com.zyproject.web.service.TreeService;
import com.zyproject.web.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
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.Arrays;
import java.util.List; /**
* @program: zyproject
* @description: 实现SpringSecrity UserDetailService接口
* @author: zhouyu(zhouyu629 # qq.com)
* @create: 2020-02-12
**/
@Service
public class MyUserDetailService implements UserDetailsService {
@Autowired
private UserService userService;
@Autowired
private TreeService treeService; @Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
ResponseData<UserEntity> userResult = userService.findByLoginname(s);
UserEntity user = new UserEntity();
if(userResult.getCode() == CodeEnum.SUCCESS.getCode()){
user = userResult.getData(UserEntity.class);
ResponseData rightResult = treeService.getRoleTreefuncByUserid(user.getUser_id());
Gson gson = new Gson();
List<RoleTreefuncEntity> roleTreefuncEntities = Arrays.asList(gson.fromJson(gson.toJson(rightResult.getData()),RoleTreefuncEntity[].class));
return new MyUserDetails(user,roleTreefuncEntities);
}else{
throw new UsernameNotFoundException(s);
}
}
}
3. SecurityConfiguration配置
1) 覆写protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder),实现MD5密码校验
2) protected void configure(HttpSecurity httpSecurity),实现自定义表单登录
package com.zyproject.web.secrity; 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.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.PasswordEncoder; /**
* @program: zyproject
* @description: SpringSercrity配置
* @author: zhouyu(zhouyu629 # qq.com)
* @create: 2020-02-12
**/
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired
private MyUserDetailService myUserDetailService; @Autowired
private MyAuthenctiationFailureHandler myAuthenctiationFailureHandler; @Autowired
private MyAuthenctiationSucessHandler myAuthenctiationSucessHandler; @Override
protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception{
authenticationManagerBuilder.userDetailsService(myUserDetailService).passwordEncoder(new PasswordEncoder() {
@Override
public String encode(CharSequence charSequence) {
return MD5Util.encode((String)charSequence);
} @Override
public boolean matches(CharSequence charSequence, String s) {
return s.equals(MD5Util.encode((String)charSequence));
}
});
} @Override
protected void configure(HttpSecurity httpSecurity) throws Exception{
httpSecurity.headers().frameOptions().disable();
httpSecurity
.authorizeRequests()
.antMatchers("/manage/error","/manage/login/**","/manage/login-submit","/manage/images/**","/manage/js/**","/manage/css/**","/manage/fonts/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
//指定登录路径
.loginPage("/manage/login")
.loginProcessingUrl("/manage/login-submit") //表单请求的路径,貌似无用,已经在config里做密码校验了
.failureHandler(myAuthenctiationFailureHandler)
.successHandler(myAuthenctiationSucessHandler)
.failureUrl("/manage/error?key=1002")
.defaultSuccessUrl("/manage/index")
.usernameParameter("username")
.passwordParameter("password")
//必须允许所有用户访问我们的登录页(例如未验证的用户,否则验证流程就会进入死循环)
.permitAll()
.and()
.sessionManagement()
.invalidSessionUrl("/manage/error?key=timeout");
//默认都会产生一个hiden标签 里面有安全相关的验证 防止请求伪造 这边我们暂时不需要 可禁用掉
httpSecurity.csrf().disable();
} @Override
public void configure(WebSecurity webSecurity) throws Exception{
super.configure(webSecurity);
}
}
五、FreeMarker集成
待续
六、权限管理
待续
微服务迁移记(五):WEB层搭建(2)-SpringSecurity集成的更多相关文章
- 微服务迁移记(五):WEB层搭建(5)-集成ueditor编辑器,伪分布式图片上传
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- 微服务迁移记(五):WEB层搭建(3)-FreeMarker集成
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- 微服务迁移记(五):WEB层搭建(4)-简单的权限管理
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- 微服务迁移记(五):WEB层搭建(1)
WEB层是最终表现层,注册至注册中心,引用接口层(不需要引用实现层).公共服务层.用户登录使用SpringSecurity,Session保存在redis中,权限管理没有用SpringSecurity ...
- docker微服务部署之:二、搭建文章微服务项目
docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...
- docker微服务部署之:三,搭建Zuul微服务项目
docker微服务部署之:二.搭建文章微服务项目 一.新增demo_eureka模块,并编写代码 右键demo_parent->new->Module->Maven,选择Module ...
- docker微服务部署之:一,搭建Eureka微服务项目
先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...
- 微服务实践(五):微服务的事件驱动数据管理 - DockOne.io
原文:微服务实践(五):微服务的事件驱动数据管理 - DockOne.io [编者的话]本文是使用微服务创建应用系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第 ...
- .Net微服务实践(五)[服务发现]:Consul介绍和环境搭建
目录 介绍 服务发现 健康检查.键值存储和数据中心 架构 Consul模式 环境安装 HTTP API 和Command CLI 示例API介绍 最后 在上篇.Net微服务实践(四)[网关]:Ocel ...
随机推荐
- VSCode 使用 Settings Sync 同步配置和插件
简要说明: Settings Sync插件可以在不同的计算机同步VSCode配置和插件. 安装和配置 在VSCode的插件栏搜索settings sync并安装.在安装完成之后如果需要重新载入就点击重 ...
- igate(因特网网关)
网关:Gateway 又称网间连接器.协议转换器.-----复杂的网络互连设备. 网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连.网关既可以用于广域网互连,也可以 ...
- 听说你还不知道CompletableFuture?
java8已经在日常开发编码中非常普遍了,掌握运用好它可以在开发中运用几行精简代码就可以完成所需功能.今天将介绍CompletableFuture的在生产环境如何使用实践.CompletableFut ...
- css3常见好看的投影效果_css3阴影box-shadow高大上用法
在设计图会经常使用到的阴影效果,如何用css3来实现呢?这篇文章主要整理box-shadow的一些好看常用的投影效果. 1.曲面/椭圆投影效果: 代码如下: <style> .shadow ...
- zabbix + grafana 展示
环境CentOS 7.5 一,grafana 安装. 1,配置yum源 cat > /etc/yum.repos.d/grafana.repo <<EOF [grafana] nam ...
- Least Cost Bracket Sequence,题解
题目链接 题意: 给你一个含有(,),?的序列,每个?变成(或)有一定的花费,问变成课匹配的括号的最小花费. 分析: 首先如果能变成匹配的,那么就有右括号的个数始终不多于左括号且左右括号数量相等,那就 ...
- Springboot下实现阿里云短信验证功能(含代码)
Springboot下实现阿里云短信验证功能 一 开通阿里云短信服务 阿里云官网注册登录 找到短信服务并开通 打开短信服务的管理台 在国内消息那栏中添加签名管理和模板管理(按照格式要求去写) 在右上角 ...
- mysql两种重要的引擎
其中MyISAM:不支持事物,表锁 .frm : 表结构定义文件 .MYD: 表数据 .MYI:索引文件 InnoDB:支持事物,行锁 .frm : 表结构定义文件 .ibd:表空间(数据和索引)
- PE解析器与加载器编写指南
PE解析器与加载器编写指南 最近准备去实习,看公司要求应该开发PE相关的查杀引擎,因此再回头复习一下PE格式,重新写一个PE解析器和PE加载器,再此记录下有关坑. PE解析器部分: 1)如何确定节区表 ...
- 蕴含式(包含EXISTS语句的分析)
*{ font-family: STFangSong; outline: none; } 蕴含式 一.蕴含式基础 (Ⅰ)什么是"蕴含式" 设p.q为两个命题.复合命题"如 ...