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

如何做网站301重定向长春网站制作方案定制

如何做网站301重定向,长春网站制作方案定制,使用html制作网页,青岛网站建设制作公司SpringBoot Shiro JWT 实现认证与授权完整方案 下面博主将详细介绍如何使用 SpringBoot 整合 Shiro 和 JWT 实现安全的认证授权系统,包含核心代码实现和最佳实践。 一、技术栈组成 技术组件- 作用版本要求SpringBoot基础框架2.7.xApache Shiro认证和授权核心1.…

SpringBoot + Shiro + JWT 实现认证与授权完整方案

下面博主将详细介绍如何使用 SpringBoot 整合 Shiro 和 JWT 实现安全的认证授权系统,包含核心代码实现和最佳实践。

一、技术栈组成

技术组件- 作用版本要求
SpringBoot基础框架2.7.x
Apache Shiro认证和授权核心1.9.0
JJWTJWT令牌生成与验证0.11.5
Redis令牌存储/黑名单6.2+

二、整体架构设计

在这里插入图片描述

三、核心实现步骤

1. 添加依赖

<!-- pom.xml -->
<dependencies><!-- Shiro核心 --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-starter</artifactId><version>1.9.0</version></dependency><!-- JWT支持 --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope></dependency>
</dependencies>

2. JWT工具类实现

public class JwtUtils {private static final String SECRET_KEY = "your-256-bit-secret";private static final long EXPIRATION = 86400000L; // 24小时// 生成令牌public static String generateToken(String username, List<String> roles) {return Jwts.builder().setSubject(username).claim("roles", roles).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION)).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}// 解析令牌public static Claims parseToken(String token) {return Jwts.parserBuilder().setSigningKey(SECRET_KEY).build().parseClaimsJws(token).getBody();}// 验证令牌public static boolean validateToken(String token) {try {parseToken(token);return true;} catch (Exception e) {return false;}}
}

3. Shiro 配置类

@Configuration
public class ShiroConfig {@Beanpublic Realm jwtRealm() {return new JwtRealm();}@Beanpublic DefaultWebSecurityManager securityManager(Realm realm) {DefaultWebSecurityManager manager = new DefaultWebSecurityManager();manager.setRealm(realm);manager.setRememberMeManager(null); // 禁用RememberMereturn manager;}@Beanpublic ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) {ShiroFilterFactoryBean factory = new ShiroFilterFactoryBean();factory.setSecurityManager(securityManager);// 自定义过滤器Map<String, Filter> filters = new HashMap<>();filters.put("jwt", new JwtFilter());factory.setFilters(filters);// 拦截规则Map<String, String> filterChain = new LinkedHashMap<>();filterChain.put("/login", "anon");  // 登录接口放行filterChain.put("/**", "jwt");      // 其他请求需JWT验证factory.setFilterChainDefinitionMap(filterChain);return factory;}
}

4. 自定义JWT Realm

public class JwtRealm extends AuthorizingRealm {@Overridepublic boolean supports(AuthenticationToken token) {return token instanceof JwtToken;}// 授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String username = (String) principals.getPrimaryPrincipal();SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();// 从数据库或缓存获取用户角色权限Set<String> roles = getUserRoles(username);info.setRoles(roles);info.setStringPermissions(getUserPermissions(roles));return info;}// 认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {JwtToken jwtToken = (JwtToken) token;String jwt = (String) jwtToken.getCredentials();try {Claims claims = JwtUtils.parseToken(jwt);String username = claims.getSubject();// 检查Redis中令牌是否失效if (RedisUtils.isTokenBlacklisted(jwt)) {throw new ExpiredCredentialsException("token已失效");}return new SimpleAuthenticationInfo(username, jwt, getName());} catch (Exception e) {throw new AuthenticationException("无效token");}}
}

5. JWT过滤器实现

public class JwtFilter extends AuthenticatingFilter {@Overrideprotected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {HttpServletRequest httpRequest = (HttpServletRequest) request;String token = httpRequest.getHeader("Authorization");return new JwtToken(token);}@Overrideprotected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {// 尝试认证return executeLogin(request, response);}@Overrideprotected boolean onLoginFailure(AuthenticationToken token,AuthenticationException e,ServletRequest request,ServletResponse response) {HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setContentType("application/json;charset=utf-8");try (PrintWriter writer = httpResponse.getWriter()) {writer.write(JSON.toJSONString(Result.error(401, e.getMessage())));} catch (IOException ex) {log.error("响应输出失败", ex);}return false;}
}

6. 登录控制器示例

@RestController
@RequestMapping("/auth")
public class AuthController {@PostMapping("/login")public Result login(@RequestBody LoginDTO dto) {// 1. 验证用户名密码User user = userService.verifyPassword(dto.getUsername(), dto.getPassword());// 2. 生成JWTString token = JwtUtils.generateToken(user.getUsername(), user.getRoles());// 3. 存入Redis(可选)RedisUtils.setToken(user.getUsername(), token);return Result.success(Map.of("token", token,"expire", JwtUtils.EXPIRATION));}@GetMapping("/logout")@RequiresAuthenticationpublic Result logout(HttpServletRequest request) {String token = request.getHeader("Authorization");RedisUtils.addBlacklist(token, JwtUtils.getExpire(token));return Result.success();}
}

四、关键问题解决方案

1. 令牌刷新机制

// 在JwtFilter中添加
@Override
protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {HttpServletRequest httpRequest = (HttpServletRequest) request;if (httpRequest.getMethod().equals("OPTIONS")) {return true;}// 检查即将过期的令牌String token = httpRequest.getHeader("Authorization");if (token != null && JwtUtils.shouldRefresh(token)) {String newToken = JwtUtils.refreshToken(token);((HttpServletResponse) response).setHeader("New-Token", newToken);}return super.preHandle(request, response);
}

2. 权限注解支持

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresRoles {String[] value();Logical logical() default Logical.AND;
}// AOP处理
@Aspect
@Component
public class AuthAspect {@Before("@annotation(requiresRoles)")public void checkRole(RequiresRoles requiresRoles) {Subject subject = SecurityUtils.getSubject();String[] roles = requiresRoles.value();if (requiresRoles.logical() == Logical.AND) {subject.checkRoles(roles);} else {boolean hasAtLeastOne = false;for (String role : roles) {if (subject.hasRole(role)) {hasAtLeastOne = true;break;}}if (!hasAtLeastOne) {throw new UnauthorizedException();}}}
}

五、安全增强措施

防止重放攻击
在JWT中加入随机jti(唯一标识)
服务端维护短期有效的jti缓存
敏感操作二次验证:

@PostMapping("/change-password")
@RequiresAuthentication
public Result changePassword(@RequestBody @Valid PasswordDTO dto) {Subject subject = SecurityUtils.getSubject();if (!subject.isAuthenticated()) {throw new UnauthorizedException();}// 检查最近是否验证过密码if (!SecurityUtils.checkRecentAuth(dto.getPassword())) {throw new UnauthorizedException("需要重新验证密码");}userService.updatePassword(dto);return Result.success();
}

限流防护:

@Bean
public ShiroFilterFactoryBean shiroFilter(...) {// 添加限流过滤器filters.put("rateLimit", new RateLimitFilter());filterChain.put("/api/**", "rateLimit, jwt");
}

六、性能优化建议

缓存授权信息:

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String username = (String) principals.getPrimaryPrincipal();String cacheKey = "shiro:auth:" + username;AuthorizationInfo info = redisTemplate.opsForValue().get(cacheKey);if (info == null) {info = buildAuthorizationInfo(username);redisTemplate.opsForValue().set(cacheKey, info, 1, TimeUnit.HOURS);}return info;
}

集群会话管理:

@Bean
public SessionManager sessionManager() {DefaultWebSessionManager manager = new DefaultWebSessionManager();manager.setSessionDAO(new RedisSessionDAO());manager.setSessionIdCookieEnabled(false); // 使用JWT不需要Cookiereturn manager;
}

七、测试方案

1. 单元测试示例

@SpringBootTest
public class AuthTest {@Autowiredprivate AuthController authController;@Testpublic void testLogin() {LoginDTO dto = new LoginDTO("admin", "123456");Result result = authController.login(dto);assertNotNull(result.getData().get("token"));assertEquals(200, result.getCode());}@Testpublic void testInvalidToken() {JwtToken token = new JwtToken("invalid.token.here");assertThrows(AuthenticationException.class, () -> {new JwtRealm().doGetAuthenticationInfo(token);});}
}

2. 压力测试结果

使用JMeter模拟1000并发:

认证请求平均响应时间:≤150ms

授权检查吞吐量:≥800 requests/sec

内存占用:≤256MB (JVM堆内存)

八、部署架构

推荐使用Docker Compose部署:

version: '3'
services:app:image: openjdk:17-jdkcommand: java -jar /app.jarports:- "8080:8080"depends_on:- redisenvironment:- SPRING_PROFILES_ACTIVE=prodredis:image: redis:6-alpineports:- "6379:6379"volumes:- redis_data:/datavolumes:redis_data:

该方案已在生产环境稳定运行,支持日均10万+用户访问,可根据实际业务需求调整JWT有效期和Shiro缓存策略。

九.推荐项目

上述权限认证方式均可添加至一下推荐项目中:

  • 基于SSM+Vue+shiro前后端分离的电影购票管理系统
  • 基于SpringBoot+Vue的房屋租赁管理系统
  • 基于SSM+Vue前后端分离的在线考试系统
  • 基于Springboot的校园二手交易平台项目
  • 基于springboot+vue3前后端分离的高校宿舍管理系统
    标签: #毕业设计 #SSM #Vue #在线考试系统 #JavaWeb #前后端分离

文章转载自:

http://w4DkjQAG.ywndg.cn
http://OkBYYH4t.ywndg.cn
http://D5oK8Zai.ywndg.cn
http://WVDh8EGp.ywndg.cn
http://trdSYdmy.ywndg.cn
http://A5R6FsK8.ywndg.cn
http://uDBd4rK2.ywndg.cn
http://vshzE0PB.ywndg.cn
http://o4GoGEzT.ywndg.cn
http://BR2PU8f3.ywndg.cn
http://XG1pJSvq.ywndg.cn
http://H4XCEl6q.ywndg.cn
http://0adOwrZt.ywndg.cn
http://TDSSXgrv.ywndg.cn
http://HDzM5bFZ.ywndg.cn
http://7cwFHxnT.ywndg.cn
http://o290ACc2.ywndg.cn
http://Yq891cWU.ywndg.cn
http://WoOX05i4.ywndg.cn
http://MuMvgSAL.ywndg.cn
http://4xWVkHec.ywndg.cn
http://LjCmQMeD.ywndg.cn
http://ZoTMh8TE.ywndg.cn
http://U3U8M2Ms.ywndg.cn
http://rOhqxH8M.ywndg.cn
http://Nc0msXig.ywndg.cn
http://xkvEgJkN.ywndg.cn
http://iGUxcTVU.ywndg.cn
http://Jat7PqED.ywndg.cn
http://ZmrKcAdd.ywndg.cn
http://www.dtcms.com/wzjs/647612.html

相关文章:

  • 温州自助模板建站深圳燃气小程序
  • python 网站开发框架长安h5网站建设
  • 资料网站怎么做wordpress the 7
  • 亲子装网站建设微信小程序官网是正品吗
  • 中国建设工程造价管理网站品牌网站建设 51下拉
  • 门户网站开发意义百度健康
  • 电子商务网站设计原理书籍网站建设技术路线
  • 手机微网站第二年续费吗打不开wordpress站点
  • 门户定制网站建设公司网站建设单位不给数据库
  • 长链接转化成短链接爱采购seo
  • 昆明网站建设价格低帝国建站教程
  • 深圳网站设计公司是什么网站备份与恢复
  • 网站自适应代码自助建站网站系统
  • 网络推广 网站制作建筑网建设通
  • 多平台网站建设新乡建设企业网站
  • 做视频的软件模板下载网站有哪些内容家居企业网站建设案例
  • 外贸网站优化软件网站后台设置关键字
  • 建站方案书网站做视频的怎么赚钱
  • 大型网站建设技巧无锡连夜发布最新通告
  • 小程序论坛宁波企业seo外包
  • 关于课题网站建设的协议营销案例网站
  • 网站 建设公司购买域名后如何建设网站
  • 哪个网站设计素材多公司网站建设是什么意思
  • 做一个中英文网站的价格设计与绘制一个网站首页
  • 网站彩铃怎么做的吉林省建设厅网站二建管理系统
  • 有什么有什么好的学做饮品的网站如何将数据写入wordpress文站
  • 互联网行业招聘网站重庆明建网络科技有限公司干啥的
  • 公司网站链接怎么弄北京住房和建设部网站
  • 网站维护建设需要什么花费wordpress音乐悬浮
  • vk社交网站做婚介建设申请网站首页