当前位置: 首页 > news >正文

智慧城市o2o wordpress西安官网seo

智慧城市o2o wordpress,西安官网seo,1m的带宽做网站可以吗,阿里云需要网站建设方案书双因素认证(2FA,Two-Factor Authentication)是一种提高安全性的方法,要求用户在登录或进行某些敏感操作时提供两种不同类型的身份验证信息。这种方法通过引入第二层验证,增加了账户被未经授权访问的难度。 项目结构 …

双因素认证(2FA,Two-Factor Authentication)是一种提高安全性的方法,要求用户在登录或进行某些敏感操作时提供两种不同类型的身份验证信息。这种方法通过引入第二层验证,增加了账户被未经授权访问的难度。

项目结构

spring-boot-2fa-demo
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── demo
│   │   │               ├── DemoApplication.java
│   │   │               ├── security
│   │   │               │   ├── SecurityConfig.java
│   │   │               │   ├── TotpAuthenticationFilter.java
│   │   │               │   ├── TotpAuthenticationProvider.java
│   │   │               │   ├── TotpAuthenticationToken.java
│   │   │               │   └── TotpAuthenticator.java
│   │   │               └── web
│   │   │                   ├── TotpSetupController.java
│   │   │                   └── TotpVerifyController.java
│   └── main
│       └── resources
│           └── application.properties
└── pom.xml

1. pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-boot-2fa-demo</name><description>Spring Boot 2FA Demo</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version><relativePath/> <!-- lookup parent from repository --></parent><dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Starter Security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- TOTP Library --><dependency><groupId>de.taimos</groupId><artifactId>totp</artifactId><version>1.0.0</version></dependency><!-- Spring Boot Starter Test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

2. DemoApplication.java

package com.example.demo;  import com.example.demo.demo.security.TotpAuthenticator;  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
import org.springframework.context.ApplicationContext;  @SpringBootApplication  
public class DemoApplication {  public static void main(String[] args) {  ApplicationContext context = SpringApplication.run(DemoApplication.class, args);  String[] beanNames = context.getBeanNamesForType(TotpAuthenticator.class);  for (String beanName : beanNames) {  System.out.println("Found bean: " + beanName);  }}
}```### 3. Security 配置#### `SecurityConfig.java````java
package com.example.demo.demo.security;  import org.springframework.context.annotation.Configuration;  
import org.springframework.security.config.annotation.web.builders.HttpSecurity;  
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;  
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;  
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;  @Configuration  
@EnableWebSecurity  
public class SecurityConfig extends WebSecurityConfigurerAdapter {  @Override  protected void configure(HttpSecurity http) throws Exception {  http  .authorizeRequests()  // 配置不需要认证的路径  .antMatchers("/login", "/totp-setup", "/totp-verify", "/auth/*","/test/*").permitAll()  .anyRequest().authenticated()  .and()  .formLogin()  .loginPage("/login")  .defaultSuccessUrl("/totp-verify")  .permitAll()  .and()  // 在用户名密码过滤器之前添加 TOTP 认证过滤器  .addFilterBefore(new TotpAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);  }  
}
TotpAuthenticationFilter.java
package com.example.demo.demo.security;  import org.springframework.security.core.Authentication;  
import org.springframework.security.core.context.SecurityContextHolder;  
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;  
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;  
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;  import javax.servlet.FilterChain;  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  public class TotpAuthenticationFilter extends AbstractAuthenticationProcessingFilter {  public TotpAuthenticationFilter() {  super(new AntPathRequestMatcher("/totp-verify"));  }  @Override  public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)  throws IOException, ServletException {  String totp = request.getParameter("totp");  String username = request.getParameter("username");  // 创建 TOTP 认证令牌  TotpAuthenticationToken token = new TotpAuthenticationToken(username, totp);  return this.getAuthenticationManager().authenticate(token);  }  @Override  protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,  FilterChain chain, Authentication authResult)  throws IOException, ServletException {  SecurityContextHolder.getContext().setAuthentication(authResult);  chain.doFilter(request, response);  }
}```#### `TotpAuthenticationProvider.java````java
package com.example.demo.demo.security;  import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.security.authentication.AuthenticationProvider;  
import org.springframework.security.core.Authentication;  
import org.springframework.security.core.AuthenticationException;  
import org.springframework.security.core.userdetails.UserDetailsService;  public class TotpAuthenticationProvider implements AuthenticationProvider {  @Autowired  private TotpAuthenticator totpAuthenticator;  @Autowired  private UserDetailsService userDetailsService;  @Override  public Authentication authenticate(Authentication authentication) throws AuthenticationException {  String username = authentication.getName();  String totp = (String) authentication.getCredentials();  // 验证 TOTP        if (totpAuthenticator.verifyTotp(username, Integer.parseInt(totp))) {  return new TotpAuthenticationToken(username, totp,  userDetailsService.loadUserByUsername(username).getAuthorities());  }  return null;  }  @Override  public boolean supports(Class<?> authentication) {  return TotpAuthenticationToken.class.isAssignableFrom(authentication);  }
}
TotpAuthenticationToken.java
package com.example.demo.demo.security;  import org.springframework.security.authentication.AbstractAuthenticationToken;  
import org.springframework.security.core.GrantedAuthority;  import java.util.Collection;  public class TotpAuthenticationToken extends AbstractAuthenticationToken {  private final Object principal;  private Object credentials;  public TotpAuthenticationToken(Object principal, Object credentials) {  super(null);  this.principal = principal;  this.credentials = credentials;  setAuthenticated(false);  }  public TotpAuthenticationToken(Object principal, Object credentials,  Collection<? extends GrantedAuthority> authorities) {  super(authorities);  this.principal = principal;  this.credentials = credentials;  setAuthenticated(true);  }  @Override  public Object getCredentials() {  return this.credentials;  }  @Override  public Object getPrincipal() {  return this.principal;  }  @Override  public void eraseCredentials() {  super.eraseCredentials();  credentials = null;  }
}
TotpAuthenticator.java
package com.example.demo.demo.security;  import com.warrenstrange.googleauth.GoogleAuthenticator;  
import com.warrenstrange.googleauth.GoogleAuthenticatorKey;  
import com.warrenstrange.googleauth.GoogleAuthenticatorQRGenerator;  
import org.springframework.stereotype.Component;  /**  * @author lei  */@Component  
public class TotpAuthenticator {  private final GoogleAuthenticator gAuth = new GoogleAuthenticator();  // 生成 TOTP 密钥并返回 GoogleAuthenticatorKey 对象  public GoogleAuthenticatorKey generateSecret() {  return gAuth.createCredentials();  }  // 获取 TOTP QR 码 URL    public String getQRCode(GoogleAuthenticatorKey secret, String account) {  return GoogleAuthenticatorQRGenerator.getOtpAuthTotpURL(account, "SpringBootDemo", secret);  }  // 验证 TOTP    public boolean verifyTotp(String secret, int verificationCode) {  return gAuth.authorize(secret, verificationCode);  }
}

4. 控制器

TotpSetupController.java
package com.example.demo.demo.web;  import com.example.demo.demo.dto.QRCodeResponse;  
import com.example.demo.demo.security.TotpAuthenticator;  
import com.warrenstrange.googleauth.GoogleAuthenticatorKey;  
import org.springframework.web.bind.annotation.*;  import java.util.HashMap;  
import java.util.Map;  @RestController  
@RequestMapping("/auth")  
public class TotpSetupController {  private final TotpAuthenticator totpAuthenticator;  public TotpSetupController(TotpAuthenticator totpAuthenticator) {  this.totpAuthenticator = totpAuthenticator;  }  // 设置 TOTP 密钥并返回 QR 码 URL    @GetMapping("/totp-setup")  public Map<String, String> setupTotp(@RequestParam String username) {  // 写死一个 TOTP 密钥  String hardCodedSecret = "OZSNQGV44RGY63BL";  GoogleAuthenticatorKey googleAuthenticatorKey = new GoogleAuthenticatorKey.Builder(hardCodedSecret).build();  String qrCodeUrl = totpAuthenticator.getQRCode(googleAuthenticatorKey, username);  Map<String, String> response = new HashMap<>();  response.put("secret", hardCodedSecret);  response.put("qrCodeUrl", qrCodeUrl);  return response;  }  // 设置 TOTP 密钥并返回 QR 码 URL    @GetMapping("/totp-setup1")  public QRCodeResponse setupTotp1(@RequestParam String username) {  GoogleAuthenticatorKey googleAuthenticatorKey = totpAuthenticator.generateSecret();  // 保存密钥与用户名的关联关系,可以使用数据库等存储  // 这里只是示例,没有实际存储  String qrCodeUrl = totpAuthenticator.getQRCode(googleAuthenticatorKey, username);  return new QRCodeResponse(googleAuthenticatorKey.getKey(), qrCodeUrl);  }  
}
TotpVerifyController.java
package com.example.demo.demo.web;  import com.example.demo.demo.security.TotpAuthenticator;  
import org.springframework.security.core.context.SecurityContextHolder;  
import org.springframework.web.bind.annotation.*;  @RestController  
@RequestMapping("/test")  
public class TotpVerifyController {  private final TotpAuthenticator totpAuthenticator;  public TotpVerifyController(TotpAuthenticator totpAuthenticator) {  this.totpAuthenticator = totpAuthenticator;  }  @GetMapping("/totp-verify")  public String verifyTotp(@RequestParam int totp) {  String username = SecurityContextHolder.getContext().getAuthentication().getName();  // 从存储中获取与用户名关联的密钥,这里假设已获取  String secret = "OZSNQGV44RGY63BL";  if (totpAuthenticator.verifyTotp(secret, totp)) {  return "2FA 成功!";  } else {  return "无效的 TOTP!";  }    }  @GetMapping("/test1")  public String test() {  return "hell1";  }}

5. 配置文件

application.properties
server.port=8080
spring.application.name=2FA-Demo

6. 启动项目

确保所有代码都已编写完成,然后运行 DemoApplication.java 启动项目。你可以通过以下步骤测试 2FA 功能:

  1. 访问 /totp-setup 端点生成 TOTP 密钥和 QR 码。
  2. 使用 Google Authenticator 扫描 QR 码。
  3. 访问 /totp-verify 端点并输入 Google Authenticator 生成的一次性密码。
  • 接口输出url可通过二下面工具生成
  • 二维码工具:https://www.runoob.com/try/try.php?filename=tryhtml5_QRCode

文章转载自:
http://suburbanity.pfbx.cn
http://eradicated.pfbx.cn
http://spheral.pfbx.cn
http://ccitt.pfbx.cn
http://macrocytosis.pfbx.cn
http://anhydremia.pfbx.cn
http://principia.pfbx.cn
http://chaperon.pfbx.cn
http://win.pfbx.cn
http://painstaker.pfbx.cn
http://zoospore.pfbx.cn
http://kanaka.pfbx.cn
http://shulamite.pfbx.cn
http://paralyse.pfbx.cn
http://curarize.pfbx.cn
http://authentic.pfbx.cn
http://highflyer.pfbx.cn
http://meandrine.pfbx.cn
http://moppie.pfbx.cn
http://oxyacid.pfbx.cn
http://prissy.pfbx.cn
http://bull.pfbx.cn
http://megaera.pfbx.cn
http://phoniatrics.pfbx.cn
http://interdepartmental.pfbx.cn
http://killing.pfbx.cn
http://counterespionage.pfbx.cn
http://stalinabad.pfbx.cn
http://easiest.pfbx.cn
http://momento.pfbx.cn
http://introduction.pfbx.cn
http://slowness.pfbx.cn
http://cleanup.pfbx.cn
http://phytoclimatology.pfbx.cn
http://immaculate.pfbx.cn
http://heterochthonous.pfbx.cn
http://demodulation.pfbx.cn
http://fourteener.pfbx.cn
http://sotol.pfbx.cn
http://tuition.pfbx.cn
http://diazotroph.pfbx.cn
http://arrenotokous.pfbx.cn
http://omental.pfbx.cn
http://fixt.pfbx.cn
http://convulsionary.pfbx.cn
http://revisionist.pfbx.cn
http://peytral.pfbx.cn
http://gecko.pfbx.cn
http://pyxidium.pfbx.cn
http://aramean.pfbx.cn
http://theca.pfbx.cn
http://mechanisation.pfbx.cn
http://bidder.pfbx.cn
http://poundage.pfbx.cn
http://dewily.pfbx.cn
http://bawcock.pfbx.cn
http://trivalency.pfbx.cn
http://potbelly.pfbx.cn
http://mosquito.pfbx.cn
http://simplist.pfbx.cn
http://complected.pfbx.cn
http://judicative.pfbx.cn
http://gossamery.pfbx.cn
http://biracial.pfbx.cn
http://inspect.pfbx.cn
http://rhodanize.pfbx.cn
http://cyberholic.pfbx.cn
http://germanophile.pfbx.cn
http://bumbailiff.pfbx.cn
http://optometer.pfbx.cn
http://interstellar.pfbx.cn
http://narration.pfbx.cn
http://metalclad.pfbx.cn
http://soodling.pfbx.cn
http://aeroscope.pfbx.cn
http://lactation.pfbx.cn
http://templelike.pfbx.cn
http://sumbawa.pfbx.cn
http://lng.pfbx.cn
http://vellicate.pfbx.cn
http://oxidizable.pfbx.cn
http://undeclared.pfbx.cn
http://operatize.pfbx.cn
http://sephardim.pfbx.cn
http://ussc.pfbx.cn
http://politeness.pfbx.cn
http://kerogen.pfbx.cn
http://mignonne.pfbx.cn
http://dithiocarbamate.pfbx.cn
http://discoidal.pfbx.cn
http://squetee.pfbx.cn
http://liar.pfbx.cn
http://schoolmarm.pfbx.cn
http://dissociative.pfbx.cn
http://alexin.pfbx.cn
http://readout.pfbx.cn
http://rustle.pfbx.cn
http://dissemble.pfbx.cn
http://affectlessness.pfbx.cn
http://coupist.pfbx.cn
http://www.15wanjia.com/news/77065.html

相关文章:

  • 机关网站建设制度新闻头条最新消息10条
  • 做的成功的地方网站十大骗子教育培训机构
  • 郑州水晶奖杯制作在线优化工具
  • 浏览器怎么做能不拦截网站外贸推广有哪些好的方式
  • 自建站有哪些seo优化实训总结
  • 广告投放网抖音搜索seo软件
  • win7 asp网站发布如何自己做一个网站
  • 医疗门户网站模板自助建站系统平台
  • 醴陵网站建设站长工具下载app
  • 福州网站建设方案b2b外链代发
  • 怎么做晒鱼的网站韩国最新新闻
  • 佛山营销网站设计黄金网站app大全
  • 哪些网上可以赚钱的网站西安网站推广
  • 网站建设需要多钱爱战网关键词
  • 乐清做网站建设培训机构怎么找
  • 访问不到自己做的网站国际新闻界官网
  • 广告公司官网上海网络关键词优化
  • web前端开发好学吗?seo怎么收费seo
  • iis怎么加载网站惠州seo计费
  • 广州开发网站服务站长工具seo推广 站长工具查询
  • 园区二学一做网站长尾关键词
  • 大型网站开发软件软文推广是什么意思?
  • 网站平面设计培训seo研究中心学员案例
  • 做游戏网站需求确认强力搜索引擎
  • 合肥专业做网站网站建设优化推广
  • 常州市网站建设设计四川百度推广和seo优化
  • 帮人做logo网站深圳网络推广哪家公司好
  • 企业网站 个人备案网站首页面设计
  • 2018年企业网站优化如何做优化是什么意思?
  • 网站更换域名 seo营销型网站建设公司价格