先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
//配置/user/login/**开头的资源,可以匿名访问(不用登录就可以访问),
//其中anon为shiro框架指定的匿名过滤器 chainDefinition.addPathDefinition(“/user/login/**”,“anon”);
//配置登出操作
chainDefinition.addPathDefinition(“/user/logout”,“logout”);
//配置以/**开头的资源必须都要经过认证,
//其中authc为shiro框架指定的认证过滤器
chainDefinition.addPathDefinition(“/**”, “authc”);
return chainDefinition;
}
第四步:在spring的配置文件(application.yml)中,添加登录页面的配置,关键代码如下:
shiro:
loginUrl: /login.html
说明:假如没有login.html,需要先准备login.html
打开浏览器,输入http://localhost/user/检测是否会出现登录窗口。
=======================================================================
身份认证即判定用户是否是系统的合法用户,用户访问系统资源时的认证(对用户身份信息的认证)流程图所示:
其中认证流程分析如下:
-
系统调用subject的login方法将用户信息提交给SecurityManager
-
SecurityManager将认证操作委托给认证器对象Authenticator
-
Authenticator将用户输入的身份信息传递给Realm。
-
Realm访问数据库获取用户信息然后对信息进行封装并返回。
-
Authenticator 对realm返回的信息进行身份认证。
思考:不使用shiro框架如何完成认证操作?filter,intercetor。
第一步: 定义Realm类,并修改ShiroRealm中获取认证信息的方法,关键代码如下:
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)
throws AuthenticationException {
//1.获取用户提交的认证用户信息
UsernamePasswordToken upToken=(UsernamePasswordToken) authenticationToken;
String username=upToken.getUsername();
//2.基于用户名查询从数据库用户信息
//3.判断用户是否存在
if(!“jack”.equals(username)) throw new UnknownAccountException();//账户不存在
//5.封装认证信息并返回
String salt=“ABCD”;
ByteSource credentialsSalt= ByteSource.Util.bytes(salt);
String hashedPassword=“来自数据库的密码”;
SimpleAuthenticationInfo info=
new SimpleAuthenticationInfo(
username, //principal 传入的用户身份
hashedPassword,//hashedCredentials
credentialsSalt,//credentialsSalt
getName());
return info;
}
第二步:在ShiroRealm中重谢获取凭证加密算法的方法,关键代码如下:
@Override
public CredentialsMatcher getCredentialsMatcher() {
HashedCredentialsMatcher matcher=new HashedCredentialsMatcher();
matcher.setHashAlgorithmName(“MD5”);
matcher.setHashIterations(1);
return matcher;
}
第三步:定义Controller逻辑
@GetMapping(“/login/{username}/{password}”)
public JsonResult doLogin(@PathVariable String username,
@PathVariable String password){
//将账号和密码封装token对象
UsernamePasswordToken token = //参考官网
new UsernamePasswordToken(username, password);
//基于subject对象将token提交给securityManager
Subject subject = SecurityUtils.getSubject();
subject.login(token);//提交给securityManager
return new JsonResult(“login ok”);
}
第四步::统一异常处理类中添加shiro异常处理代码,关键如下:
@ExceptionHandler(ShiroException.class)
public JsonResult doShiroException(ShiroException e){
JsonResult r=new JsonResult();
r.setState(0);
if(e instanceof UnknownAccountException){
r.setMessage(“用户名不存在”);
}else if(e instanceof IncorrectCredentialsException){
r.setMessage(“密码不正确”);
}else if(e instanceof LockedAccountException){
r.setMessage(“账户被锁定”);
}else if(e instanceof AuthorizationException){
r.setMessage(“没有权限”);
}else{
r.setMessage(“认证或授权失败”);
}
return r;
}
假如已配置,则可忽略。
第一步:在过滤配置中允许登录时的url匿名访问,关键代码如下:
chainDefinition.addPathDefinition(“/user/login/**”,“anon”);
第二步:再过滤配置中配置登出url操作,关键代码如下:
chainDefinition.addPathDefinition(“/user/logout”,“logout”);
第三步:启动服务器,进行登录、登出访问测试
======================================================================
授权即对用户资源访问的授权(是否允许用户访问此资源),用户访问系统资源时的授权流程如图所示:
其中授权流程分析如下:
-
系统调用subject相关方法将用户信息(例如isPermitted)递交给SecurityManager。
-
SecurityManager将权限检测操作委托给Authorizer对象。
-
Authorizer将用户信息委托给realm。
-
Realm访问数据库获取用户权限信息并封装。
-
Authorizer对用户授权信息进行判定。
思考:思考不使用shiro如何完成授权操作?intercetor,aop。
4.2 授权逻辑实现
4.2.1 Realm逻辑
修改ShiroRealm中获取权限并封装权限信息的方法,关键代码如下:
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principalCollection) {
//1.获取登录用户(登录时传入的用户身份是谁)
//2.基于登录用户id获取用户权限标识(后续从数据库获取)
Set stringPermissions=new HashSet<>();
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!