一个基于 Spring Security 的动态权限控制快速使用包

前言

在日常项目中,Spring Security 的默认认证流程满足不了的需求。

但是,一般的项目对于认证、鉴权这块儿的需要又是十分类似的。

所以,我针对日常项目的认证鉴权需求,将 Spring Security 进行了一层包装。

项目地址、以及测试项目地址,都放在文尾了。

项目说明

本项目完全基于 Spring Security,只针对日常开发项目中的认证、动态权限需求做一层封装。

干净纯洁,没有其他乱七八糟的功能。

可用于项目快速开发Spring Security 框架学习

另鉴于目前 JWT 用的最多,内置封装逻辑为,认证成功后生成 token 返回。

token 中包含 userId、roleIds。Token 内容示例:

 {
 alg: "HS256"
 }.
 {
 roles: "10,1,5",
 exp: 1626480624,
 userId: "1"
 }.
 [signature] 

效果展示

0.正常登录

 ├─authentication 鉴权相关处理
 ├─authorization  认证相关处理
 ├─config         Security配置
 ├─constant       常量
 ├─filter         过滤器(登录入口、JWT 处理入口)
 ├─handle         认证、鉴权结果处理器
 ├─loginlogic     抽象登录逻辑
 │  └─base
 ├─model          实体
 └─utils          工具类 

总体流程

登录请求

业务请求

快速使用

0.引入依赖

此包未发布到中央仓库,请自行安装至本地仓库。

 <dependency>
     <groupId>pri.damai</groupId>
     <artifactId>fast-security</artifactId>
     <version>0.0.1-SNAPSHOT</version>
 </dependency> 

2.提供用户查询接口。也就是对接用户数据库。``` @Component  public class UserServiceImpl{

     static List<FastUserInfo> userList = new ArrayList<>();      // .....      public FastUserInfo loadUserByPhone(String phone) {          return userList.stream()                .filter(user -> user.getPhone().equals(phone))                .findAny()                .orElseThrow(() -> new AuthenticationServiceException("无此用户"));    }  }

​
3.实现登录逻辑有几种登录方式,就有几种实现类。注意`getSupportLoginType()`返回值要区别开。```
 @Component
 public class PhoneLogin extends AbstractLoginLogic {
  
     @Resource
     UserServiceImpl userService;
  
     @Override
     public String getSupportLoginType() {
         return "phone";
   }
  
     @Override
     public void checkParam(LoginData loginData) throws AuthenticationException {
         String msg = null;
         if (loginData.getPhone() == null) {
             msg = "手机号不可为空";
       }
         if (loginData.getPhoneVerifyCode() == null) {
             msg = msg + ", 短信验证码不可为空";
       }
         if (!Objects.equals(msg, null)) {
             this.throwException(msg);
       }
   }
  
     @Override
     protected void login(LoginData loginData) throws AuthenticationException {
         if (!"22".equals(loginData.getPhoneVerifyCode())) {
             this.throwException("验证码错误");
       }
         // 具体登录逻辑
         FastUserInfo fastUserInfo = this.getUserDetails(loginData);
   }
  
     @Override
     public FastUserInfo getUserDetails(LoginData loginData) {
         return userService.loadUserByPhone(loginData.getPhone());
   }
  
     private void throwException(String msg) {
         throw new AuthenticationServiceException(msg);
   }
 } 

4.实现 ResourceService 接口 。通过此接口,提供权限查询功能。也就是对接权限数据库。缓存不缓存就在于你自己的实现了。``` @Component  public class MyResourceImpl implements ResourceService {

     static HashMap<String, List<String>> roleMap = new HashMap<>();      // ......      @Override      public List<String> getRolesByUrl(String url) {          return roleMap.get(url);    }  }

​
其他扩展功能
------
​
### 可选 yml 配置
​
以下配置均有默认值,有指定要求时再配置即可。
​

fast-security:  not-login-urls: # 指定无需登录即可访问的接口

  • /user login-url: # 指定登录接口的url  expiration: # 指定 token 过期时间  jwt-secret: # 指定 Jwt 密匙  authentication-failed-code: # 指定登录失败错误码  unauthorized-code: # 指定未认证错误码  permission-denied-code:  # 指定未授权错误码  no-roles-pass: # 未配置Url时,是否直接放行

​
### 登录成功处理器
​
在实际开发中,我们可能需要存储 token。可实现 `LoginSuccessResultHandler` 接口来自定义功能。
​

@Component  public class GGLoginSuccessResultHandler implements LoginSuccessResultHandler {      @Override      public Object handleResult(UserDetails userDetails, String token) {          // 保存 token or 其他操作          return null;    }  }

​
### 自定义登录失败处理器
​

@Component public class GGLoginFailureResultHandler implements LoginFailureResultHandler {@Overridepublic Object handleResult(AuthenticationException e) {return null;} }

网络安全入门学习路线

其实入门网络安全要学的东西不算多,也就是网络基础+操作系统+中间件+数据库,四个流程下来就差不多了。

1.网络安全法和了解电脑基础

其中包括操作系统Windows基础和Linux基础,标记语言HTML基础和代码JS基础,以及网络基础、数据库基础和虚拟机使用等...

别被这些看上去很多的东西给吓到了,其实都是很简单的基础知识,同学们看完基本上都能掌握。计算机专业的同学都应该接触了解过,这部分可以直接略过。没学过的同学也不要慌,可以去B站搜索相关视频,你搜关键词网络安全工程师会出现很多相关的视频教程,我粗略的看了一下,排名第一的视频就讲的很详细。 当然你也可以看下面这个视频教程仅展示部分截图 学到http和https抓包后能读懂它在说什么就行。

2.网络基础和编程语言

3.入手Web安全

web是对外开放的,自然成了的重点关照对象,有事没事就来入侵一波,你说不管能行吗! 想学好Web安全,咱首先得先弄清web是怎么搭建的,知道它的构造才能精准打击。所以web前端和web后端的知识多少要了解点,然后再学点python,起码得看懂部分代码吧。

最后网站开发知识多少也要了解点,不过别紧张,只是学习基础知识。

等你用几周的时间学完这些,基本上算是具备了入门合格渗透工程师的资格,记得上述的重点要重点关注哦! 再就是,要正式进入web安全领域,得学会web渗透,OWASP TOP 10等常见Web漏洞原理与利用方式需要掌握,像SQL注入/XSS跨站脚本攻击/Webshell木马编写/命令执行等。

这个过程并不枯燥,一边打怪刷级一边成长岂不美哉,每个攻击手段都能让你玩得不亦乐乎,而且总有更猥琐的方法等着你去实践。

学完web渗透还不算完,还得掌握相关系统层面漏洞,像ms17-010永恒之蓝等各种微软ms漏洞,所以要学习后渗透。可能到这里大家已经不知所云了,不过不要紧,等你学会了web渗透再来看会发现很简单。

其实学会了这几步,你就正式从新手小白晋升为入门学员了,真的不算难,你上你也行。

4.安全体系

不过我们这个水平也就算个渗透测试工程师,也就只能做个基础的安全服务,而这个领域还有很多业务,像攻防演练、等保测评、风险评估等,我们的能力根本不够看。

所以想要成为一名合格的网络工程师,想要拿到安全公司的offer,还得再掌握更多的网络安全知识,能力再更上一层楼才行。即便以后进入企业,也需要学习很多新知识,不充实自己的技能就会被淘汰。

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

尾言

因为入门学习阶段知识点比较杂,所以我讲得比较笼统,最后联合CSDN整理了一套【282G】网络安全从入门到精通资料包,需要的小伙伴可以点击链接领取哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security是一个基于Spring框架的安全框架,可用于实现各种安全策略,括身份验证、授权、攻击防护等。在权限管理方面,Spring Security提供了一些基本的实现,例如使用注解控制权限使用表达式控制权限等,但是这些实现都比较简单,无法满足复杂的权限管理需求。 因此,我们可以考虑基于RBAC(基于角色的访问控制)模型来实现Spring Security权限管理。RBAC模型是一种广泛应用的访问控制模型,通过将用户、角色和权限三者之间的关系建立起来,实现对系统资源的控制。 下面是一个基于RBAC模型的Spring Security权限管理的实现步骤: 1. 定义用户、角色和权限实体类,建立它们之间的关系。例如,一个用户可以有多个角色,一个角色可以含多个权限。 2. 在数据库中建立用户、角色和权限的表,并将它们之间的关系存储在中间表中。 3. 使用Spring Security的UserDetailsService接口来实现用户认证,根据用户名从数据库中查询用户信息,括用户对应的角色信息。 4. 使用Spring Security的AccessDecisionVoter接口来实现授权决策。在该接口的实现中,从数据库中查询当前用户对应的所有权限,并根据用户请求的资源路径和请求方法来判断用户是否有权限访问该资源。 5. 在Spring Security的配置中配置相应的过滤器链,例如UsernamePasswordAuthenticationFilter、BasicAuthenticationFilter等。同时,定义自己的过滤器,例如RoleBasedAuthorizationFilter,用于实现RBAC模型的权限控制。 6. 在Controller层使用注解进行权限控制,例如@PreAuthorize、@PostAuthorize等。 通过以上步骤,就可以基于RBAC模型来实现Spring Security权限管理。需要注意的是,RBAC模型的实现需要考虑到性能和安全性方面的问题,例如缓存用户权限信息、防止SQL注入等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值