广东高端网站建设报价怎么看网站是否备案

张小明 2026/1/9 22:41:17
广东高端网站建设报价,怎么看网站是否备案,淘宝关键词优化推广排名,网页设计与制作第二版电子版前言 今天我们来聊聊一个让很多Java开发者纠结的技术选型问题#xff1a;Spring Security、Apache Shiro和Sa-Token#xff0c;这3个主流安全框架到底该选哪个#xff1f; 有些小伙伴在工作中可能遇到过这样的场景#xff1a;新项目启动会上#xff0c;架构师坚持要用Sp…前言今天我们来聊聊一个让很多Java开发者纠结的技术选型问题Spring Security、Apache Shiro和Sa-Token这3个主流安全框架到底该选哪个有些小伙伴在工作中可能遇到过这样的场景新项目启动会上架构师坚持要用Spring Security团队里的老将却说Shiro更简单实用而年轻的同事则力荐Sa-Token这个后起之秀。大家各执一词都有道理到底该听谁的今天这篇文章就跟大家一起聊聊这个话题希望对你会有所帮助。1 我们为什么需要安全框架在深入对比之前我们先要理解为什么不能自己手写安全逻辑而非要用框架想象一下如果你要为一个电商系统实现权限控制你需要处理// 手写权限控制的典型痛点 public class ManualSecurityExample { // 1. 每个方法都要写重复的权限校验 public void updateProduct(Long productId, ProductDTO dto) { // 检查用户是否登录 User user getCurrentUser(); if (user null) { throw new UnauthorizedException(请先登录); } // 检查用户是否有编辑权限 if (!user.hasPermission(product:update)) { throw new ForbiddenException(没有操作权限); } // 检查是否是自己的商品数据级权限 Product product productService.getById(productId); if (!product.getOwnerId().equals(user.getId())) { throw new ForbiddenException(只能修改自己的商品); } // 实际业务逻辑... productService.update(productId, dto); } // 2. 每个Controller都要写登录检查 // 3. 需要自己管理Session/Token // 4. 密码加密、CSRF防护都要自己实现 // 5. 审计日志、安全事件处理... }看到问题了吗安全逻辑会像“幽灵代码”一样渗透到业务的每个角落导致代码重复率高业务逻辑和安全逻辑耦合难以统一维护和升级容易遗漏安全防护点安全框架的价值就是把这些问题抽象化、标准化、自动化。下面这个示意图展示了安全框架如何将安全关注点从业务代码中解耦出来理解了安全框架的价值接下来我们深入分析这三个主流选项。2 Spring Security企业级的安全“瑞士军刀”2.1 Spring Security是什么Spring Security是Spring官方提供的安全框架可以说是Spring生态中的“御林军”。它不仅仅是一个权限控制框架更是一个全面的安全解决方案。2.2 核心架构过滤器链的极致运用Spring Security的核心是过滤器链Filter Chain。当一个请求到达时它会经过一系列安全过滤器每个过滤器负责特定的安全功能2.3 快速搭建一个安全的REST API// 1. 基础配置类 Configuration EnableWebSecurity public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http // 禁用CSRFREST API通常不需要 .csrf().disable() // 授权配置 .authorizeRequests() .antMatchers(/api/public/**).permitAll() // 公开接口 .antMatchers(/api/admin/**).hasRole(ADMIN) // 需要管理员角色 .antMatchers(/api/user/**).hasAnyRole(USER, ADMIN) // 需要用户角色 .anyRequest().authenticated() // 其他所有请求需要认证 // 表单登录配置前后端分离时通常用不上 .and() .formLogin().disable() // 基础认证配置 .httpBasic() // 异常处理 .and() .exceptionHandling() .authenticationEntryPoint(restAuthenticationEntryPoint()) // 未认证处理 .accessDeniedHandler(restAccessDeniedHandler()); // 权限不足处理 } // 2. 用户详情服务从数据库加载用户 Bean public UserDetailsService userDetailsService() { return username - { // 这里实际应该查询数据库 if (admin.equals(username)) { return User.withUsername(admin) .password(passwordEncoder().encode(admin123)) .roles(ADMIN) .build(); } else if (user.equals(username)) { return User.withUsername(user) .password(passwordEncoder().encode(user123)) .roles(USER) .build(); } throw new UsernameNotFoundException(用户不存在: username); }; } // 3. 密码编码器 Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } // 4. REST API认证入口点 Bean public AuthenticationEntryPoint restAuthenticationEntryPoint() { return (request, response, authException) - { response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.getWriter().write( {\code\: 401, \message\: \未认证请先登录\} ); }; } } // 5. 在Controller中使用安全注解 RestController RequestMapping(/api) public class ProductController { GetMapping(/public/products) public ListProduct getPublicProducts() { // 公开接口无需认证 return productService.getAllProducts(); } GetMapping(/user/products) PreAuthorize(hasRole(USER)) // 需要USER角色 public ListProduct getUserProducts() { // 获取当前认证用户 Authentication auth SecurityContextHolder.getContext().getAuthentication(); String username auth.getName(); return productService.getProductsByOwner(username); } PostMapping(/admin/products) PreAuthorize(hasRole(ADMIN)) // 需要ADMIN角色 public Product createProduct(RequestBody ProductDTO dto) { return productService.createProduct(dto); } DeleteMapping(/admin/products/{id}) PreAuthorize(hasPermission(#id, product, delete)) // 方法级权限控制 public void deleteProduct(PathVariable Long id) { productService.deleteProduct(id); } }Spring Security的优势与痛点优势Spring生态原生支持与Spring Boot、Spring Cloud无缝集成功能全面认证、授权、防护CSRF、CORS、点击劫持等一应俱全高度可定制几乎每个组件都可以自定义或替换社区强大Spring官方维护文档完善社区活跃企业级特性OAuth2、SAML、LDAP等企业级集成支持痛点学习曲线陡峭概念复杂配置繁琐过度设计感简单需求也需要复杂配置调试困难过滤器链复杂问题定位困难性能开销完整的过滤器链带来一定性能损失适用场景大型企业级应用需要与Spring生态深度集成的项目需要OAuth2、LDAP等企业级认证协议的项目团队有Spring Security经验的场景有些小伙伴刚开始学Spring Security时可能会被它复杂的概念搞晕比如SecurityContext、Authentication、UserDetails、GrantedAuthority等等。但一旦掌握了它的设计哲学你会发现它真的很强大。3 Apache Shiro简单直观的“轻骑兵”3.1 Shiro是什么Apache Shiro是一个功能强大且易于使用的Java安全框架它的设计哲学是简化应用安全让安全变得更简单。如果说Spring Security是重型坦克那么Shiro就是灵活机动的轻骑兵。3.2 核心架构四大核心概念Shiro的架构围绕四个核心概念构建3.3 快速实现基于URL的权限控制// 1. Shiro配置类 Configuration public class ShiroConfig { // 创建ShiroFilterFactoryBean Bean public ShiroFilterFactoryBean shiroFilterFactoryBean( SecurityManager securityManager) { ShiroFilterFactoryBean factoryBean new ShiroFilterFactoryBean(); factoryBean.setSecurityManager(securityManager); // 设置登录页面 factoryBean.setLoginUrl(/login); // 设置未授权页面 factoryBean.setUnauthorizedUrl(/unauthorized); // 配置拦截规则 MapString, String filterChainDefinitionMap new LinkedHashMap(); // 静态资源放行 filterChainDefinitionMap.put(/static/**, anon); filterChainDefinitionMap.put(/css/**, anon); filterChainDefinitionMap.put(/js/**, anon); // 公开接口 filterChainDefinitionMap.put(/api/public/**, anon); filterChainDefinitionMap.put(/login, anon); // 需要认证的接口 filterChainDefinitionMap.put(/api/user/**, authc); filterChainDefinitionMap.put(/api/admin/**, authc, roles[admin]); // 需要特定权限的接口 filterChainDefinitionMap.put(/api/products/create, authc, perms[product:create]); filterChainDefinitionMap.put(/api/products/delete/*, authc, perms[product:delete]); // 其他所有请求需要认证 filterChainDefinitionMap.put(/**, authc); factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return factoryBean; } // 创建SecurityManager Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager new DefaultWebSecurityManager(); // 设置Realm securityManager.setRealm(customRealm()); // 设置Session管理器 securityManager.setSessionManager(sessionManager()); // 设置缓存管理器 securityManager.setCacheManager(cacheManager()); return securityManager; } // 自定义Realm连接安全数据源 Bean public Realm customRealm() { CustomRealm realm new CustomRealm(); // 设置密码匹配器 HashedCredentialsMatcher credentialsMatcher new HashedCredentialsMatcher(); credentialsMatcher.setHashAlgorithmName(SHA-256); credentialsMatcher.setHashIterations(1024); credentialsMatcher.setStoredCredentialsHexEncoded(false); realm.setCredentialsMatcher(credentialsMatcher); // 开启缓存 realm.setCachingEnabled(true); realm.setAuthenticationCachingEnabled(true); realm.setAuthenticationCacheName(authenticationCache); realm.setAuthorizationCachingEnabled(true); realm.setAuthorizationCacheName(authorizationCache); return realm; } } // 2. 自定义Realm实现 public class CustomRealm extends AuthorizingRealm { Autowired private UserService userService; // 认证逻辑验证用户身份 Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken (UsernamePasswordToken) token; String username upToken.getUsername(); // 从数据库查询用户 User user userService.findByUsername(username); if (user null) { throw new UnknownAccountException(用户不存在); } if (!user.isEnabled()) { throw new DisabledAccountException(用户已被禁用); } // 返回认证信息 return new SimpleAuthenticationInfo( user, // 身份 principal user.getPassword(), // 凭证 credentials getName() // realm name ); } // 授权逻辑获取用户的角色和权限 Override protected AuthorizationInfo doGetAuthorizationInfo( PrincipalCollection principals) { User user (User) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo new SimpleAuthorizationInfo(); // 添加角色 SetString roles userService.findRolesByUserId(user.getId()); authorizationInfo.setRoles(roles); // 添加权限 SetString permissions userService.findPermissionsByUserId(user.getId()); authorizationInfo.setStringPermissions(permissions); return authorizationInfo; } } // 3. 在Controller中使用Shiro RestController RequestMapping(/api) public class ProductController { GetMapping(/products) public ListProduct getProducts() { // 获取当前用户 Subject currentUser SecurityUtils.getSubject(); // 检查是否已认证 if (!currentUser.isAuthenticated()) { throw new UnauthorizedException(请先登录); } // 检查是否有权限 if (!currentUser.isPermitted(product:view)) { throw new ForbiddenException(没有查看权限); } // 执行业务逻辑 return productService.getAllProducts(); } PostMapping(/products) public Product createProduct(RequestBody ProductDTO dto) { Subject currentUser SecurityUtils.getSubject(); // 使用Shiro的权限注解需要AOP支持 currentUser.checkPermission(product:create); // 或者使用编程式检查 // if (!currentUser.isPermitted(product:create)) { // throw new ForbiddenException(没有创建权限); // } return productService.createProduct(dto); } GetMapping(/admin/dashboard) public DashboardVO getAdminDashboard() { Subject currentUser SecurityUtils.getSubject(); // 检查是否具有admin角色 currentUser.checkRole(admin); return dashboardService.getAdminDashboard(); } }Shiro的优势与痛点优势简单直观API设计简洁学习成本低配置灵活支持INI、XML、注解等多种配置方式功能完整认证、授权、会话管理、加密、缓存等一应俱全不依赖容器可以在任何Java环境中运行易于集成与Spring、Spring Boot等框架集成简单痛点Spring生态整合不够原生需要额外配置社区活跃度下降相比Spring Security社区维护力度减弱功能扩展性有限某些高级功能需要自己实现文档相对陈旧部分文档更新不及时适用场景中小型项目追求快速开发非Spring项目或Spring生态不重的项目团队对Spring Security不熟悉需要简单权限控制的内部系统有些小伙伴喜欢Shiro的简洁特别是它的INI配置文件几行配置就能搞定基本的权限控制。但当你需要更复杂的功能时可能会发现需要自己写不少代码。4 Sa-Token国产新星的“后起之秀”4.1 Sa-Token是什么Sa-Token是一个轻量级Java权限认证框架由国内开发者开发。它的设计理念是以最少的配置完成最全面的权限认证功能。在Spring Security和Shiro之外Sa-Token提供了一种新的选择。4.2 核心特性简单而强大Sa-Token的核心设计哲学可以概括为“简单、强大、灵活”。它通过几个核心组件实现了完整的安全控制4.3 5分钟搭建完整权限系统// 1. 添加依赖pom.xml // dependency // groupIdcn.dev33/groupId // artifactIdsa-token-spring-boot-starter/artifactId // version1.34.0/version // /dependency // 2. 配置文件application.yml // sa-token: // token-name: satoken # token名称 // timeout: 2592000 # token有效期单位秒默认30天 // active-timeout: -1 # token活跃有效期-1代表不限制 // is-concurrent: true # 是否允许并发登录 // is-share: true # 在多人登录同一账号时是否共享token // max-login-count: 12 # 同一账号最大登录数量 // is-write-header: true # 是否将token写入响应头 // token-style: uuid # token风格 // is-log: false # 是否打印操作日志 // 3. 配置类可选 Configuration public class SaTokenConfig { // 注册拦截器 Bean public SaInterceptor saInterceptor() { return new SaInterceptor() // 校验登录状态不包含登录接口 .addPathPatterns(/**) .excludePathPatterns(/api/user/login) .excludePathPatterns(/api/public/**) // 权限校验规则 .check(r - { // 1. 检查登录状态 SaRouter.match(/api/**, () - { StpUtil.checkLogin(); }); // 2. 角色校验 SaRouter.match(/api/admin/**, () - { StpUtil.checkRole(admin); }); // 3. 权限校验 SaRouter.match(/api/products/create, () - { StpUtil.checkPermission(product.create); }); SaRouter.match(/api/products/delete/**, () - { StpUtil.checkPermission(product.delete); }); }); } } // 4. 登录认证Controller RestController RequestMapping(/api/user) public class UserController { PostMapping(/login) public ApiResult login(RequestBody LoginDTO dto) { // 1. 验证用户名密码 User user userService.findByUsername(dto.getUsername()); if (user null || !passwordEncoder.matches(dto.getPassword(), user.getPassword())) { return ApiResult.error(用户名或密码错误); } // 2. 登录Sa-Token会自动创建token StpUtil.login(user.getId()); // 3. 获取token信息 String tokenValue StpUtil.getTokenValue(); long tokenTimeout StpUtil.getTokenTimeout(); // 4. 返回用户信息和token LoginVO vo new LoginVO(); vo.setUserId(user.getId()); vo.setUsername(user.getUsername()); vo.setToken(tokenValue); vo.setExpireTime(tokenTimeout); // 5. 可以设置一些session信息 StpUtil.getSession().set(userInfo, user); return ApiResult.success(登录成功, vo); } PostMapping(/logout) public ApiResult logout() { // 注销当前会话 StpUtil.logout(); return ApiResult.success(注销成功); } GetMapping(/info) public ApiResult getUserInfo() { // 获取当前登录用户ID Object loginId StpUtil.getLoginId(); // 获取用户信息 User user userService.findById(Long.parseLong(loginId.toString())); // 获取用户权限列表 ListString permissionList StpUtil.getPermissionList(); // 获取用户角色列表 ListString roleList StpUtil.getRoleList(); UserInfoVO vo new UserInfoVO(); vo.setUser(user); vo.setPermissions(permissionList); vo.setRoles(roleList); return ApiResult.success(vo); } } // 5. 业务Controller中使用 RestController RequestMapping(/api/products) public class ProductController { GetMapping(/list) public ApiResult getProductList() { // 无需手动检查登录状态拦截器已处理 // 获取当前登录用户ID long userId StpUtil.getLoginIdAsLong(); ListProduct products productService.getProductsByOwner(userId); return ApiResult.success(products); } PostMapping(/create) public ApiResult createProduct(RequestBody ProductDTO dto) { // 使用注解方式检查权限 // SaCheckPermission(product.create) 也可以这样用 // 编程式检查权限 StpUtil.checkPermission(product.create); long userId StpUtil.getLoginIdAsLong(); dto.setOwnerId(userId); Product product productService.createProduct(dto); return ApiResult.success(product); } DeleteMapping(/{id}) SaCheckPermission(product.delete) // 注解方式权限检查 public ApiResult deleteProduct(PathVariable Long id) { // 除了权限检查还可以检查数据权限 Product product productService.getById(id); long currentUserId StpUtil.getLoginIdAsLong(); if (product.getOwnerId() ! currentUserId) { // 不是自己的商品检查是否有管理员权限 StpUtil.checkRole(admin); } productService.deleteProduct(id); return ApiResult.success(删除成功); } GetMapping(/admin/dashboard) SaCheckRole(admin) // 注解方式角色检查 public ApiResult getAdminDashboard() { DashboardVO dashboard dashboardService.getAdminDashboard(); return ApiResult.success(dashboard); } } // 6. 进阶功能踢人下线、账号封禁 Service public class AdvancedSecurityService { // 强制注销踢人下线 public void forceLogout(Object loginId) { StpUtil.logout(loginId); } // 封禁账号 public void disableAccount(Object loginId, long disableTime) { // 封禁指定时间单位秒 StpUtil.disable(loginId, disableTime); } // 检查是否被封禁 public boolean isDisabled(Object loginId) { return StpUtil.isDisable(loginId); } // 二级认证敏感操作需要再次验证 public boolean startSecondAuth(long ttl) { // 开启二级认证有效期为ttl秒 return StpUtil.openSafe(ttl); } // 检查二级认证 public void checkSecondAuth() { StpUtil.checkSafe(); } }Sa-Token的优势与痛点优势API设计极其简洁StpUtil.xxx()几乎涵盖了所有操作开箱即用几乎零配置就能使用功能丰富除了基础认证授权还提供踢人下线、账号封禁、二级认证等高级功能国产框架中文文档完善符合国人使用习惯轻量级依赖少启动快痛点相对较新生态不如Spring Security和Shiro成熟社区规模小遇到复杂问题可能难以找到解决方案企业级特性有限对OAuth2、LDAP等支持较弱过度封装某些场景下灵活性不足适用场景中小型项目追求开发效率团队对Spring Security/Shiro不熟悉需要快速搭建权限系统的原型或内部工具偏好国产框架和中文文档的团队有些小伙伴第一次用Sa-Token时会被它的简洁惊艳到。几行代码就实现了其他框架需要大量配置的功能。但对于大型复杂系统可能需要仔细评估它的扩展性和长期维护性。5 三大框架全方位对比了解了每个框架的单独特点后我们来一个全方位的对比5.1 详细对比表5.2 技术特性详细对比6 如何做出最佳选择面对三个各有优劣的框架如何做出最适合自己项目的选择我总结了一个决策流程图帮助你在不同场景下做出明智决策6.1 具体场景建议场景一大型电商平台选择Spring Security理由需要完善的OAuth2社交登录、支付安全、风控系统实施要点使用Spring Security OAuth2 Client集成第三方登录自定义安全过滤器实现风控逻辑与Spring Cloud Gateway整合实现统一认证使用Method Security注解实现细粒度权限控制场景二企业内部管理系统选择Apache Shiro理由权限模型相对固定需要快速开发团队熟悉Shiro实施要点使用INI配置文件快速定义URL权限规则集成Ehcache缓存权限数据提升性能自定义Realm连接企业LDAP/AD域利用Shiro标签在页面上控制元素显示场景三创业公司MVP产品选择Sa-Token理由需要快速上线验证想法团队规模小追求开发效率实施要点利用Sa-Token的零配置特性快速搭建使用注解方式实现基本权限控制集成Redis实现分布式会话利用Sa-Token的踢人功能实现基础管理场景四微服务架构系统混合方案理由不同服务有不同的安全需求实施要点网关层Spring Security OAuth2统一认证核心业务服务Spring Security细粒度控制内部管理服务Apache Shiro简单权限工具类微服务Sa-Token快速开发6.2 如果选错了怎么办有些小伙伴可能会遇到这样的情况项目初期选型不合适随着业务发展需要迁移到其他框架。这里提供一些迁移建议渐进式迁移新旧框架并行逐步替换抽象隔离层创建统一的安全接口底层实现可替换分模块迁移按业务模块逐个迁移降低风险充分测试特别是边缘案例和权限组合场景// 抽象安全接口示例 public interface SecurityService { // 认证相关 boolean login(String username, String password); void logout(); boolean isAuthenticated(); // 授权相关 boolean hasPermission(String permission); boolean hasRole(String role); // 用户信息 Object getCurrentUser(); Long getCurrentUserId(); } // Spring Security实现 Service public class SpringSecurityServiceImpl implements SecurityService { // 实现基于Spring Security的接口 } // 需要迁移时只需实现新的实现类 Service public class SaTokenServiceImpl implements SecurityService { // 实现基于Sa-Token的接口 // 业务代码无需修改只需切换实现 }总结经过深入分析我们可以得出以下结论Spring Security是企业级重型武器功能全面但复杂适合大型项目和有经验的团队。Apache Shiro是灵活实用的轻骑兵平衡了功能与复杂度适合大多数中小型项目。Sa-Token是快速开发的利器API简洁但生态相对年轻适合追求开发效率的场景。实际上没有完美的框架只有合适的框架。文章转载自苏三说技术原文链接https://www.cnblogs.com/12lisu/p/19412274体验地址http://www.jnpfsoft.com/?from001YH
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

自己做都网站怎么发朋友圈便宜做网站价格

在无人机技术快速发展的今天,安全测试已成为保障无人机系统可靠运行的关键环节。Drone Hacking Tool作为一款专业的无人机安全测试工具,集成了Wi-Fi检测和GPS信号测试等多种测试手段,为安全研究人员提供了完整的解决方案。 【免费下载链接】D…

张小明 2026/1/3 15:24:01 网站建设

个人备案 网站名称 例子wordpress面板中文

如何实现TensorRT引擎的热更新而不中断服务? 在AI系统大规模部署的今天,一个模型上线后可能每天都在迭代——业务需求变化、数据分布漂移、精度持续优化。但与此同时,用户对服务可用性的要求却越来越高:金融交易中的语音识别不能卡…

张小明 2026/1/4 19:56:03 网站建设

献县网站做网站用html好还是vue好

2 系统设计方案 2.1 系统原理 药品分拣系统是医疗机构必备设备之一,它可以提高药品分配的效率和准确性,从而更好地保障患者用药安全和治疗效果。本文基于STM32单片机进行开发,使用OLED和Drivic双显示屏实现药品图片的双屏显示,同时…

张小明 2026/1/7 3:59:51 网站建设

昆明市网站备案区域名 网站建设公司的销售好做吗

前言 相信很多同学了解到和学习网络安全的时候都听过kali系统,大家都称之为黑客最喜爱的系统,那么什么是kali,初学者用kali能做些什么,胡子哥我将在本文中做详细的介绍: 一、kali linux是什么? Kali Lin…

张小明 2026/1/3 17:23:52 网站建设

万网网站多少域名抢注哪个平台好

洛纳 - 库法列夫演化与预麦克斯韦方程研究 1. 洛纳 - 库法列夫演化概述 洛纳 - 库法列夫演化的研究涉及哈密顿形式和泊松结构的定义。其主要成果是将洛纳 - 库法列夫演化嵌入到西格尔 - 威尔逊格拉斯曼流形中,并且证明了维拉索罗生成元在哈密顿流中是守恒的。通过引入 $\tau…

张小明 2026/1/3 18:21:28 网站建设