前言
在日常项目中,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】网络安全从入门到精通资料包,需要的小伙伴可以点击链接领取哦!