网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
第二步:打开浏览器输入http://localhost:8080,然后呈现登录页面,例如:
在登录窗口中输入用户名user(系统默认),密码(服务启动时,控制台默认输出的
密码),然后点击Sign in进行登录,登录成功默认会出现,如下界面:
在项目的resources目录下创建static目录,并在此目录创建一个index.html文件,例如:
Login Ok
启动服务,再次进行登录访问测试,登录成功以后系统默认会跳转到index.html页面,例如
第一步:编写一个方法(可以在启动类中调用执行),对一个名文进行加密,例如:
static void encodePwd(){
BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
String password=“123456”;//明文
String newPwd=encoder.encode(“123456”);
System.out.println(newPwd);//$2a 10 10 10fahHJIe3SJm3KcyiPPQ2d.a2qR029gB3qKHrKanQ87u.KbtZ6Phr.
}
第二步:将用户和密码在在springboot工程的application.yml文件中进行配置,例如:
spring:
security:
user:
name: jack
#password: 123456 #这种写法,密码太简单了
password: ‘{bcrypt}$2a 10 10 10fahHJIe3SJm3KcyiPPQ2d.a2qR029gB3qKHrKanQ87u.KbtZ6Phr.’
其中,{bcrypt}指定了密码加密时使用的算法
第三步:启动服务,重新进行登录测试.
===============================================================================
SpringSecurity支持通过配置文件的方式定义用户信息(账号密码和角色等),但这种方式有明显的缺点,那就是系统上线后,用户信息的变更比较麻烦。因此SpringSecurity还支持通过实现UserDetailsService接口的方式来提供用户认证授权信息,其应用过程如下:
第一步:定义security配置类,例如:
/**
由@Configuration注解描述的类为spring中的配置类,配置类会在spring
工程启动时优先加载,在配置类中通常会对第三方资源进行初始配置.
*/
@Configuration
public class SecurityConfig {
/**
定义SpringSecurity密码加密对象
@Bean 注解通常会在@Configuration注解描述的类中描述方法,
用于告诉spring框架这个方法的返回值会交给spring管理,并spring
管理的这个对象起个默认的名字,这个名字与方法名相同,当然也可以通过
@Bean注解起名字
*/
@Bean //对象名默认为方法名
//@Bean(“bcryptPasswordEncoder”)//bean对象名字为bcryptPasswordEncoder
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
第二步:定义UserDetailService接口实现类,自定义登陆逻辑,代码如下:
UserDetailService为SpringSecurity官方提供的登录逻辑处理对象,我们自己可以实现此接口,然后在对应的方法中进行登录逻辑的编写即可.
package com.cy.jt.security.service;
@Service
public class UserDetailServiceImpl implements UserDetailsService {
@Autowired
private BCryptPasswordEncoder passwordEncoder;
/**
当我们执行登录操作时,底层会通过过滤器等对象,调用这个方法.
@param username 这个参数为页面输出的用户名
@return 一般是从数据库基于用户名查询到的用户信息
@throws UsernameNotFoundException
*/
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
//1.基于用户名从数据库查询用户信息
//User user=userMapper.selectUserByUsername(username);
if(!“jack”.equals(username))//假设这是从数据库查询的信息
throw new UsernameNotFoundException(“user not exists”);
//2.将用户信息封装到UserDetails对象中并返回
//假设这个密码是从数据库查询出来的
String encodedPwd=passwordEncoder.encode(“123456”);
//假设这个权限信息也是从数据库查询到的
//假如分配权限的方式是角色,编写字符串时用"ROLE_"做前缀
List grantedAuthorities =
AuthorityUtils.commaSeparatedStringToAuthorityList(
“ROLE_admin,ROLE_normal,sys:res:retrieve,sys:res:create”);
//这个user是SpringSecurity提供的UserDetails接口的实现,用于封装用户信息
//后续我们也可以基于需要自己构建UserDetails接口的实现
User user=new User(username,encodedPwd,grantedAuthorities);
return user;
}
}
说明,这里的User对象会交给SpringSecurity框架,框架提取出密码信息,然后与用户输入的密码进行匹配校验.
第三步:启动服务进行登陆,访问测试。
第一步:定义登陆页面(直接在static目录下创建即可),关键代码如下:
Please sign in
Sign in
注意:请求的url暂时为”/login”,请求方式必须为post方式,请求的参数暂时必须为username,password。这些规则默认在UsernamePasswordAuthenticationFilter中进行了定义。
第二步:修改安全配置类,让其实现接口,并重写相关config方法,进行登陆设计,代码如下:
@Configuration
public class SecutiryConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//super.configure(http);
//关闭跨域攻击,不关闭容易出错
http.csrf().disable();
//自定义登陆表单
http.formLogin()
//设置登陆页面
.loginPage(“/login.html”)
//设置登陆请求处理地址(对应form表单中的action),登陆时会访问UserDetailService对象
.loginProcessingUrl(“/login”)
//设置请求用户名参数为username(默认就是username,可以自己修改,需要与表单同步)
.usernameParameter(“username”)
//请求请求密码参数为password(默认就是password,可以自己修改,需要与表单同步)
.passwordParameter(“password”)
//设置登陆成功跳转页面(默认为/index.html)
.defaultSuccessUrl(“/index.html”)
//登陆失败访问的页面(默认为/login.html?error)
.failureUrl(“/login.html?error”);
//认证设计
http.authorizeRequests()
//设置要放行的咨询
.antMatchers(“/login.html”).permitAll()
//设置需要认证的请求(除了上面的要放行,其它都要进行认证)
.anyRequest().authenticated();
}
}
现在的很多系统都采用的是前后端分离设计,我们登陆成功以后可能会跳转到前端系统的某个地址,或者返回一个json数据,我们可以自己定义登录成功的处理操作,例如:
定义登陆成功处理器:
方案1:可以直接执行重定向的处理器,例如
package com.cy.jt.auth.config.authentication;
public class RedirectAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
//定义要跳转的url
private String redirectUrl;
public RedirectAuthenticationSuccessHandler(String redirectUrl){
this.redirectUrl=redirectUrl;
}
@Override
public void onAuthenticationSuccess(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,
Authentication authentication)
throws IOException, ServletException {
httpServletResponse.sendRedirect(redirectUrl);
}
}
方案2:可以直接返回JSON数据的处理器,例如:
package com.cy.jt.security.config.handler;
/**处理登录失败
0)Default-默认
1)Authentication-认证
2)Failure-失败
3)Handler-处理器
*/
public class DefaultAuthenticationFailureHandler implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
AuthenticationException e) throws IOException, ServletException {
//1.设置响应数据的编码
httpServletResponse.setCharacterEncoding(“utf-8”);
//2.告诉客户端响应数据的类型,以及客户端以怎样的编码进行显示
httpServletResponse.setContentType(“application/json;charset=utf-8”);
//3.获取一个输出流对象
PrintWriter out=httpServletResponse.getWriter();
//4.向客户端输出一个json格式字符串
//4.1构建一个map对象
Map<String,Object> map=new HashMap<>();
map.put(“state”,“500”);
map.put(“msg”,“username or password error”);
//4.2基于jackson中的ObjectMapper对象将一个对象转换为json格式字符串
String jsonStr= new ObjectMapper().writeValueAsString(map);
out.println(jsonStr);
out.flush();
}
}
定义登陆失败处理器:
方案1:登陆失败重定向到页面,例如
package com.cy.jt.auth.config.authentication;
public class RedirectAuthenticationFailureSuccessHandler implements AuthenticationFailureHandler {
private String redirectUrl;
public RedirectAuthenticationFailureSuccessHandler(String redirectUrl){
this.redirectUrl=redirectUrl;
}
@Override
public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
httpServletResponse.sendRedirect(redirectUrl);
}
}
方案2:定义登陆失败处理器,例如:
package com.cy.jt.security.config.handler;
/**处理登录失败
0)Default-默认
1)Authentication-认证
2)Failure-失败
3)Handler-处理器
*/
public class DefaultAuthenticationFailureHandler
implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
AuthenticationException e) throws IOException, ServletException {
//1.设置响应数据的编码
httpServletResponse.setCharacterEncoding(“utf-8”);
//2.告诉客户端响应数据的类型,以及客户端以怎样的编码进行显示
httpServletResponse.setContentType(“application/json;charset=utf-8”);
//3.获取一个输出流对象
PrintWriter out=httpServletResponse.getWriter();
//4.向客户端输出一个json格式字符串
//4.1构建一个map对象
Map<String,Object> map=new HashMap<>();
map.put(“state”,“500”);
map.put(“msg”,“username or password error”);
//4.2基于jackson中的ObjectMapper对象将一个对象转换为json格式字符串
String jsonStr= new ObjectMapper().writeValueAsString(map);
out.println(jsonStr);
out.flush();
}
}
修改配置类,设置登陆成功与失败处理器。
@Configuration
public class SecutiryConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//super.configure(http);
//关闭跨域攻击,不关闭容易出错
http.csrf().disable();
//自定义登陆表单
http.formLogin()
//设置登陆页面
.loginPage(“/login.html”)
//设置登陆请求处理地址(对应form表单中的action),登陆时会访问UserDetailService对象
.loginProcessingUrl(“/login”)
//设置请求用户名参数为username(默认就是username,可以自己修改,需要与表单同步)
.usernameParameter(“username”)
//请求请求密码参数为password(默认就是password,可以自己修改,需要与表单同步)
.passwordParameter(“password”)
//设置登陆成功跳转页面(默认为/index.html)
.successHandler(new RedirectAuthenticationSuccessHandler(“你的url”))
//登陆失败访问的页面(默认为/login.html?error)
.failureHandler(new RedirectAuthenticationFailureHandler(“你的url”))
//认证设计
http.authorizeRequests()
//设置要放行的咨询
.antMatchers(“/login.html”).permitAll()
//设置需要认证的请求(除了上面的要放行,其它都要进行认证)
.anyRequest().authenticated();
}
}
第四步:启动服务进行访问测试(分别用正确和错误的账号进行测试)。
在SecurityManager配置类中的configure(HttpSecurity http)方法中我们可以通过对anMatchers方法定义要放行静态资源,例如:
.authorizeRequests() //设置请求的授权
.antMatchers( //配置下列路径的授权
“/index.html”,
“/js/*”,
“/css/*”,
“/img/**”,
“/bower_components/**”,
“/login.html”
).permitAll() //设置上述所有路径不需要登录就能访问(放行)
其中:
“*”用于匹配0个或多个字符
“**”用于匹配0个或多个目录及字符
在SecurityManager配置类中的configure(HttpSecurity http)方法中,添加登出配置,例如
http.logout() //开始设置登出信息
.logoutUrl(“/logout”) //登出路径
.logoutSuccessUrl(“/login.html?logout”);//设置登出后显示的页面
==============================================================================
在权限配置类上添加启用全局方法访问控制注解,例如:
package com.cy.auth.config;
//这个配置类是配置Spring-Security的,
//prePostEnabled= true表示启动权限管理功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class SpringSecurityConfigurer extends WebSecurityConfigurerAdapter {
……
}
定义一个ResourceController类,作为资源访问对象,例如
package com.cy.jt.auth.controller;
@RestController
public class ResourceController {
@PreAuthorize(“hasAuthority(‘sys:res:create’)”)
@RequestMapping(“/doCreate”)
public String doCreate(){
return “add resource”;
}
@PreAuthorize(“hasAuthority(‘sys:res:update’)”)
@RequestMapping(“doUpdate”)
public String doUpdate(){
return “update resource”;
}
@PreAuthorize(“hasAuthority(‘sys:res:delete’)”)
@RequestMapping(“/doDelete”)
public String doDelete(){
return “delete resource”;
}
@PreAuthorize(“hasAuthority(‘sys:res:retrieve’)”)
@RequestMapping(“/doRetrieve”)
public String doRetrieve(){
return “retrieve resource”;
}
}
其中,@PreAuthorize注解描述方法时,用于告诉系统访问此方法时需要进行权限检测。需要具备指定权限才可以访问。例如:
@PreAuthorize(“hasAuthority('sys:res:delete”) 需要具备sys:res:delete权限
@PreAuthorize(“hasRole(‘admin’)”) 需要具备admin角色
使用不同用户进行登陆,然后执行资源访问,假如没有权限,则会看到响应状态吗403,如图所示:
=========================================================================
对于SpringSecurity框架而言,在实现认证和授权业务时,可能出现如下两大类型异常:
1)AuthenticationException (用户还没有认证就去访问某个需要认证才可访问的方法时,可能出现的异常,这个异常通常对应的状态码401)
2)AccessDeniedException (用户认证以后,在访问一些没有权限的资源时,可能会出现的异常,这个异常通常对应的状态吗为403)
SpringSecurity框架给了默认的异常处理方式,当默认的异常处理方式不满足我们实际业务需求时,此时我们就要自己定义异常处理逻辑,编写逻辑时需要遵循如下规范:
1)AuthenticationEntryPoint:统一处理 AuthenticationException 异常
2)AccessDeniedHandler:统一处理 AccessDeniedException 异常.
处理没有认证的访问异常
package com.cy.jt.config;
public class DefaultAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request,
HttpServletResponse response,
AuthenticationException e) throws IOException, ServletException {
//设置响应数据的编码
response.setCharacterEncoding(“utf-8”);
//告诉浏览器要响应的内容类型,以及编码
response.setContentType(“application/json;charset=utf-8”);
Map<String,Object> map=new HashMap<>();
map.put(“state”,401);
map.put(“message”,“请先登录”);
PrintWriter out=response.getWriter();
out.println(new ObjectMapper().writeValueAsString(map));
out.flush();
out.close();
}
}
处理没有权限时抛出的异常
package com.cy.jt.config;
public class DefaultAccessDeniedExceptionHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request,
HttpServletResponse response,
AccessDeniedException e) throws IOException, ServletException {
//设置响应数据的编码
response.setCharacterEncoding(“utf-8”);
//告诉浏览器要响应的内容类型,以及编码
response.setContentType(“application/json;charset=utf-8”);
Map<String,Object> map=new HashMap<>();
map.put(“state”,403);
map.put(“message”,“没有此资源的访问权限”);
PrintWriter out=response.getWriter();
out.println(new ObjectMapper().writeValueAsString(map));
out.flush();
out.close();
}
}
如何自学黑客&网络安全
黑客零基础入门学习路线&规划
初级黑客
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!
7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.
如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。
8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。
网络安全工程师企业级学习路线
如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的
视频配套资料&国内外网安书籍、文档&工具
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。
一些笔者自己买的、其他平台白嫖不到的视频教程。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!