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

wordpress写的网站福建seo优化

wordpress写的网站,福建seo优化,外贸网站cms系统,好看的网站排版Apache Shiro是一个强大而灵活的开源安全框架#xff0c;它干净利落地处理身份认证#xff0c;授权#xff0c;企业会话管理和加密。 官网#xff1a; http://shiro.apache.org/ 源码#xff1a; https://github.com/apache/shiro Subject#xff1a;代表当前用户或…Apache Shiro是一个强大而灵活的开源安全框架它干净利落地处理身份认证授权企业会话管理和加密。 官网 http://shiro.apache.org/ 源码 https://github.com/apache/shiro Subject代表当前用户或者当前程序在Shiro中Subject是一个接口他定义了很多认证授权的方法。 认证就是判断你这个用户是不是合法用户授权其实就是你认证成功之后你的权限能访问系统的那些资源。 SecurityManage安全管理器Subject去认证的时候需要通过SecurityManage安全管理器来负责认证和授权 安全管理器又要通过Authenticator认证器进行认证通过Authorizer授权器进行授权通过SessionManag会话管理器进行会话管理有没有发现他就相当于一个中介他来接收这些事情而干这些事情的不是他来做的。 Authenticator认证器Realm从数据库中去获取到用户信息然后认证器来做身份认证来进行身份认证。 Authorizer授权器通过认证器认证权限之后得通过授权器来判断这个用户身份有什么权限他可以访问那些资源 Realm相当于数据源从Realm中获取到用户的数据比如用户的数据在MYSQL数据库那么Realm就需要从MYSQL数据库中去获取到用户的信息然后来做身份认证。 在Realm中也有一些认证授权相关的操作。 SessionManager会话管理器不依赖web容器的session所以shiro可以使用在非web 应用上也可以将分布式应用的会话集中在一点管理此特性可使它实现单点登录。 SessionDAO会话比如要将Session存储到数据库那么可以通过jdbc来存储到数据库。 一、引入依赖 dependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-core/artifactIdversion1.5.3/version /dependency二、shiro配置文件shiro.ini用户名或者密码 [users] relaysec123456三、测试代码 public class ShiroDemo{public static void main(String[] args){//1.创建安全管理器对象DefaultSecurityManager securityManager new DefaultSecurityManager();//2.给安全管理器设置realmsecurityManager.setRealm(new IniRealm(classpath:shiro.ini));//3.SecurityUtils给全局安全工具类设置安全管理器SecurityUtils.setSecurityManager(securityManager);//4.关键对象subject主体Subject subject SecurityUtils.getSubject();//5.创建令牌UsernamePasswordToken token new UsernamePasswordToken(relaysec,123456);try{subject.login(token);//用户认证System.out.println(登录成功);}catch(UnknownAccountException e){e.printStackTrace();System.out.println(认证失败: 用户名不存在~);}catch(IncorrectCredentialsException e){e.printStackTrace();System.out.println(认证失败: 密码错误~);}} }SpringBoot整合shrio 一、创建一个war项目 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId /dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.apache.tomcat/groupIdartifactIdtomcat-juli/artifactIdversion8.5.23/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency!--引入JSP解析依赖--dependencygroupIdorg.apache.tomcat.embed/groupIdartifactIdtomcat-embed-jasper/artifactId/dependencydependencygroupIdjstl/groupIdartifactIdjstl/artifactIdversion1.2/version/dependency!--引入shiro整合Springboot依赖shiro-spring-boot-web-starter--!--CVE-2020-1957 Shiro 1.5.1--dependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-web/artifactIdversion1.4.2/version/dependency !-- dependency-- !-- groupIdorg.apache.shiro/groupId-- !-- artifactIdshiro-spring/artifactId-- !-- version1.4.2/version-- !-- /dependency--!--CVE-2020-11989 shiro 1.5.3-- !-- dependency-- !-- groupIdorg.apache.shiro/groupId-- !-- artifactIdshiro-web/artifactId-- !-- version1.4.2/version-- !-- /dependency-- !-- dependency-- !-- groupIdorg.apache.shiro/groupId-- !-- artifactIdshiro-spring/artifactId-- !-- version1.4.2/version-- !-- /dependency--!-- dependency-- !-- groupIdorg.apache.shiro/groupId-- !-- artifactIdshiro-spring/artifactId-- !-- version1.5.3/version-- !-- /dependency-- !-- dependency-- !-- groupIdorg.apache.shiro/groupId-- !-- artifactIdshiro-web/artifactId-- !-- version1.5.3/version-- !-- /dependency--dependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-web/artifactIdversion1.7.0/version/dependencydependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-spring/artifactIdversion1.7.0/version/dependency二、创建ShiroConfigConfiguration修饰 配置3个beanShiroFilterFactory、DefaultWebSecurityManager、Realm Configuration public class ShiroConfig implements EnvironmentAware{private Environment env; }①、创建ShiroFilter ShiroFilterFactoryBean shiroFilterFactoryBean new ShiroFilterFactoryBean(); //给filter设置安全管理器 shiroFilterFactoryBean setSecrityManager(defaultWebSecurityManager);//配置系统受限资源和系统公共资源 /**map的key值代表的是我们的资源map的value值代表的是我们的权限authc代表我们是需要认证和授权的anon代表我们不需要认证和授权其实代码审计去审的就是shiroConfig文件看他的jar包以及ShiroConfig配置文件 */ MapString,String map new HashMap(); //authc 请求这个资源需要认证和授权 map.put(/admin/**,anon); map.put(/admin/users,authc); map.put(/demo/**,anon); map.put(/index.jsp,authc); map.put(/hello/*, authc); map.put(/toJsonList/*,authc);shiroFilterFactoryBean.setLoginUrl(/login.jsp); shiroFilterFactoryBean.setFilterChainDefinitionMap(map); return shiroFilterFactoryBean;还有一种方式 Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager sessionManager) { //构建ShiroFilterFactoryBean对象负责创建过滤器工厂ShiroFilterFactoryBean shiroFilterFactoryBean new ShiroFilterFactoryBean(); //设置登录路径shiroFilterFactoryBean.setLoginUrl(/login); //注意必须设置SecuritManager shiroFilterFactoryBean.setSecurityManager(sessionManager); //设置访问未授权的需要跳转到的路径shiroFilterFactoryBean.setUnauthorizedUrl(/403); //设置登录成功访问路径shiroFilterFactoryBean.setSuccessUrl(/); //自定义的过滤设置注入到shiroFilter中shiroFilterFactoryBean.getFilters().put(apikey, new ApiKeyFilter());shiroFilterFactoryBean.getFilters().put(csrf, new CsrfFilter());shiroFilterFactoryBean.getFilters().put(user, new UserAuthcFilter()); //定义map指定请求过滤规则MapString, String filterChainDefinitionMap shiroFilterFactoryBean.getFilterChainDefinitionMap();ShiroUtils.loadBaseFilterChain(filterChainDefinitionMap);ShiroUtils.ignoreCsrfFilter(filterChainDefinitionMap);filterChainDefinitionMap.put(/**, apikey, csrf, authc);return shiroFilterFactoryBean; }Shiro有两种方式可进行精度控制一种是过滤器方式根据访问的URL进行控制该种方式允许使用*匹配URL可以进行粗粒度控制另一种是注解的方式实现细粒度控制但只能是在方法上控制无法控制类级别访问。 过滤器的类型有很多本文代码只用到anon和authc两种类型 定义一个Map类型的filterChainDefinitionMap使用ShiroFilterChainDefinition来控制请求路径的鉴权与授权。 创建ShiroUtils类自定义静态方法loadBaseFilterChain()和ignoreCsrfFilter()方法判断哪些请求路径需要用户登录才能访问哪些不需要登录就能访问实现粗粒度控制。 ②、创建安全管理器 将用户认证信息源设置到安全管理器 Bean public DefaultWebSecurityManager getDefaultWebSecurityManager(Realm realm){DefaultWebSecurityManager defaultWebSecurityManager new DefaultWebSecurityManager();defaultWebSecurityManager.setRealm(realm);return defaultWebSecurityManager; }还有一种方式 管理内部组件实例并通过它来提供安全管理的各种服务。 modularRealmAuthenticator是shiro提供的realm管理器用来设置realm生效, 通过setAuthenticationStrategy来设置多个realm存在时的生效规则 Bean(namesecurityManager) public DefaultWebSecurityManager securityManager(SessionManager sessionManager, MemoryConstrainedCacheManager memoryConstrainedCacheManager){DefaultWebSecurityManager dwsm new DefaultWebSecurityManager();dwsm.setSessionManager(sessionManager);dwsm.setCacheManager(memoryConstrainedCacheManager);dwsm.setAuthenticator(modularRealmAuthenticator());return dwsm; }重写ModularRealmAuthenticator只要有一个Realm验证成功即可只返回第一个Realm身份验证成功的认证信息 Bean public ModularRealmAuthenticator modularRealmAuthenticator() {UserModularRealmAuthenticator modularRealmAuthenticator new UserModularRealmAuthenticator();modularRealmAuthenticator.setAuthenticationStrategy(new FirstSuccessfulStrategy());return modularRealmAuthenticator; }securityManager不用直接注入Realm可能导致事务失效 可以定义一个handleContextRefresh方法利用监听去初始化等到ApplicationContext加载完成之后完成shiroReaml EventListener public void handleContextRefresh(ContextRefreshedEvent event){ApplicationContext context event.getApplicationContext();ListRealm realmList new ArrayList();LocalRealm localRealm context.getBean(LocalRealm.class);LdapRealm ldapRealm context.getBean(LdapRealm.class);realmList.add(LocalRealm);realmList.add(ldapRealm);context.getBean(DefaultWebSecurityManager.class).setRealms(realmList); }③、自定义Realm Bean public Realm getRealm(){CustomerRealm customerRealm new CustomerRealm();return customerRealm; }/**自定义Realm一般继承AuthorizingRealm然后实现getAuthenticationInfo()和getAuthorizationInfo()方法来完成身份认证和权限获取。 */ public class CustomerRealm extends AuthorizingRealm{/**用于授权PrincipalCollection 是一个身份集合首先通过getPrimaryPrincipal()得到传入的用户名然后调用getAuthorizationInfo()方法。再根据用户名调用 UserService接口获取角色及权限信息并将得到的用户roles放到authorizationInfo中并返回。*/Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){String userId (String) principals.getPrimaryPrincipal();return getAuthorizationInfo(userId,usserService);}public static AuthorizationInfo getAuthorizationInfo(String userId,UserService userService){SimpleAuthorizationInfo authorizationInfo new SimpleAuthorizationInfo();UserDTO userDTO userService.getUserDTO(userId);SetString roles userDTO.getRoles().stream().map(Role::getId).collect(Collectors.toSet());authorizationInfo.setRoles(roles);return authorizationInfo();}//用于验证账户和密码Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {/**//直接从参数中获取用户名和密码String username token.getUsername();String password String.valueOf(token.getPassword())*/System.out.println();//从传过来的token获取用户名String principal (String) token.getPrincipal();System.out.println(用户名principal);//假设从数据库中获得用户名密码String password_db123;String username_dbzhangsan;if (username_db.equals(principal)){ // SimpleAuthenticationInfo simpleAuthenticationInfo return new SimpleAuthenticationInfo(principal,123, this.getName());}return null;} }还有方式 展示一个LdapReam Bean注解DependsOn表示组件依赖下图中表示依赖lifecycleBeanPostProcessor LifecycleBeanPostProcessor用来管理shiro Bean的生命周期在LdapReam创建之前先创建lifecycleBeanPostProcessor Bean DependsOn(lifecycleBeanPostProcessor) public LdapRealm ldapRealm(){return new LdapRealm(); }Bean(namelifecycleBeanPostProcessor) public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){return new LifecycleBeanPostProcessor(); }三、Controller进行访问登录成功之后转发到index.jsp否则直接转发到login.jsp文件。 RequestMapping(login) public String login(String username,String password){Subject subject Security.getSubject();try{//认证成功UsernamePasswordToken token new UsernamePasswordToken(uername,password);subject.login(token);return redirect:/index.jsp;}catch(UnknownAccountException e){e.printStackTrace();System.out.println(用户名错误);}catch(IncorrectCredentialsException e){e.printStackTrace();System.out.println(密码错误);}catch(Exception e){e.printStackTrace();System.out.println(e.getMessage());}return redirect:/login.jsp; }漏洞复现 Shiro层面绕过之后SpringBoot也需要解析路径的所以如果Springboot版本过高的话可能是复现不成功的。并且不能使用Springboot集成的shiro吗那样子也有可能导致复现不成功 groupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactId version2.2.6.RELEASE/versiondependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-web/artifactIdversion1.5.0/version /dependency dependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-spring/artifactIdversion1.5.0/version /dependencyShiroConfig配置 LinkedHashMapString, String map new LinkedHashMapString, String();map.put(/login,anon);//anon 设置为公共资源 放行资源放在下面 // map.put(/user/register,anon);//anon 设置为公共资源 放行资源放在下面 // map.put(/register.jsp,anon);//anon 设置为公共资源 放行资源放在下面 // map.put(/user/getImage,anon);map.put(/doLogin, anon);map.put(/demo/**,anon);map.put(/unauth, user);map.put(/admin/*,authc);//默认认证界面路径---当认证不通过时跳转shiroFilterFactoryBean.setLoginUrl(/login.jsp);shiroFilterFactoryBean.setFilterChainDefinitionMap(map);return shiroFilterFactoryBean;Controller: 绕过方式: /demo/…;/admin/index 漏洞分析 定位到PathMatchingFilterChainResolver类的getchain方法这个方法是处理过滤的 首先调用getPathWithinApplication方法获取路径跟进去。 来到getPathWithinApplication方法继续跟进WebUtils的getPathWithinApplication方法 首先getContextPath方法获取工程路径调用getRequestUri获取访问路径跟进去getRequestUri方法 来到getRequestUri方法首先从域中获取获取不到的话调用getRequestURI方法获取路径获取的就是我们访问的//demo/…;/admin/users 这个路径然后调用decodeAndCleanUriString方法进行处理。 来到decodeAndCleanUriString方法通过indexOf方法因为我们的路径中存在分号所以他获取到的位置是第9个 然后判断如果不等于-1的话调用substring方法进行字符串截取从0到9 包前不包后 也就是说分号不需要截取截取出来的字符串就是//demo/…。然后返回上一个方法。 来到normalize方法这里进行了字符的替换 替换反斜线 替换 // 为 / 替换 /./ 为 / 替换 /…/ 为 / 然后返回。 回到getChain方法首先判断如果url不等于null并且他的最后一位是 / 的话进行字符串截取然后赋值我们拿到的字符串路径是/demo/… 所以往下走。 然后循环遍历我们的map中的内容就是我们在Shiroconfig中写的那些过滤的内容然后进行一一匹配最后匹配到/demo/**的时候然后调用proxy方法我们跟进去。 来到proxy方法首先调用getChain方法获取到请求路径对应的过滤器然后调用过滤器的proxy方法来到proxy方法 来到proxy方法首先创建了一个ProxiedFilterChain对象这个对象是一个代理对象。 基本上到这里我们的原始请求就会进入到 springboot中. springboot对于每一个进入的request请求也会有自己的处理方式,找到自己所对应的controller。 我们定位到Spring处理请求的地方。我们跟进去getPathWithinApplication方法 到getPathWithinApplication方法调用getContextPath方法获取到工程路径调用getRequestUri获取访问路径我们跟进getRequestUri方法 来到getRequestUri方法首先从域中获取获取不到的话然后通过getRequestURI方法获取到url然后调用decodeAndCleanUriString方法我们跟进去。 来到decodeAndCleanUriString方法跟进removeSemicolonContent方法。 首先获取到分号的位置然后while循环如果不等于-1的话然后进行字符串截取将我们的分号截取掉 然后返回的路径就是//demo… 回到decodeAndCleanUriString方法调用decodeRequestString进行decode解码然后调用getSanitizedPath方法进行过滤 // 然后返回。 回到getPathWithinApplication方法可以发现我们的分号已经被去掉了。 到这里基本上的流程就结束了可以发现在Spring中会过滤分号而在Shiro中不会。导致权限绕过。 应用案例登录认证 客户端提交用户账号和密码在Controller中拿到账号和密码封装到token对象.然后借助subject的login方法把数据提交给SecurityManager使用Authenticator处理tokenAuthenticator从Realm列表中获取LdapRealmLdapRealm从token中获取数据交给authenticate进行比对对比通过返回AuthenticationInfo 一、创建maven工程并导入相关依赖 shiro-core commons-logging dependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-spring/artifactIdversion1.2.5/version /dependency dependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-ehcache/artifactIdversion1.2.5/version /dependency dependencygroupIdcom.github.theborakompanioni/groupIdartifactIdthymeleaf-extras-shiro/artifactIdversion1.2.1/version /dependencydependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-quartz/artifactId/dependency登录控制器Controller PostMapping(value/signin) public ResultHolder login(RequestBody LoginRequest request){SessionUser sessionUser SessionUtils.getUser();if(sessionUser!null){if(!StringUtils.equals(sessionUser.getId(), request.getUsername())){return ResultHolder.error(Translator.get(please_logout_current_user));}SecurityUtils.getSubject().getSession().setAttribute(authenticate, UserSource.LOCAL.name());}return userService.login(request); }在login方法中把用户名和密码封装为UsernamePasswordToken对象token然后通过SecurityUtils.getSubject()获取Subject对象并将前面获取token对象作为参数。若调用subject.login(token)时不抛出任何异常说明认证通过调用subject.isAuthenticated()返回true表示当前的用户已经登录。后续可以根据subject实例获取用户信息。 public ResultHolder login(LoginRequest request) {String login (String) SecurityUtils.getSubject().getSession().getAttribute(authenticate);String username StringUtils.trim(request.getUsername());String password ;if (!StringUtils.equals(login, UserSource.LDAP.name())) {password StringUtils.trim(request.getPassword());……}UsernamePasswordToken token new UsernamePasswordToken (username, password, login);Subject subject SecurityUtils.getSubject();try {subject.login(token);if (subject.isAuthenticated()) {UserDTO user (UserDTO) subject.getSession().getAttribute(ATTR_USER);……return ResultHolder.success(subject.getSession().getAttribute(user)); } else {return ResultHolder.error(Translator.get(login_fail));} } catch (ExcessiveAttemptsException e) {throw new ExcessiveAttemptsException(Translator.get(excessive_attempts)); } …… }案例二 RestController CrossOrigin RequestMapping(/) public class LoginController{private static final Logger logger LoggerFactory.getLogger(LoginController.class);Reference //Dubbo远程调用的服务private UserService userService;RequestMapping(value/login,methodRequestMethod.POST)public ResponseEntity login(){//获取存储在系统的用户ShiroUser user (ShiroUser)SecurityUtils.getSubject().getPrincipal();//为获取的用户添加tokenuser.setToken(SecurityUtils.getSubpect().getSession().getId().toString());return ResponseEntity.ok(user);}/**获取当前登陆人的信息包括角色权限*/GetMapping(/logininfo)public ResponsseEntity loginInfo(){ShiroUser shiroUser (ShiroUser) SecurityUtils.getSubject().getPrincipal();MapString,Object map new HashMap();SetString permissions Sets.newHashSet();//将获取的角色和权限存入指定的mapUser user userService.getById(shiroUser.getUserId().intValue());map.put(roleList,user.getRoles());map.put(permissionList,permissions);map.put(userId,shiroUser.getUserId());map.put(username,shiroUser.getLoginName());return ResponseEntity.ok(map);} }
http://www.hkea.cn/news/14341582/

相关文章:

  • 国外免费建站网站网站和网页
  • 为什么做的网站要续费阿里巴巴1688网站做店铺
  • 网站建设销售人才简历网站建设电话销售不被挂断
  • 网站建设公司导航在网站上做承诺
  • 广东研发网站建设平台电子商务网店运营
  • .net电商网站开发设计电工学高等教育出版社久久建筑网
  • 新建网站的评估腾讯企点是什么软件
  • 淘客网站怎么备案网站广告条效果
  • 搭建网站赚钱湖北葛洲坝建设工程网站
  • 泉州app网站开发wordpress手机同步
  • 网站底部备案号潍坊网站制作怎么做
  • 无锡网站建设设计公司精品资料网文件下载
  • 昆山建设招标信息网站宁波seo公司推荐
  • 个人怎么开网站学家装设计师要多少钱
  • 扁平化网站设计教程软件开发外包公司好不好
  • 建设环境工程技术中心网站曹县有没有做网站
  • 网站用户体验解决方案手机微网站平台登录入口
  • 本地建设多个网站链接旅游网站的规划与建设开题报告
  • 刚做的网站适合做外链吗郴州网站优化公司
  • 平台网站怎么做的好保定百度首页优化
  • 如何查看一个网站的浏览量为什么我的网站在百度搜不到
  • 总结 设网站车间生产管理软件免费
  • 河南城乡建设网站wordpress前台漏洞
  • 建设银行招生网站空间ip地址访问网站
  • 东莞贸易公司寮步网站建设价格wordpress 淘客网站
  • 阿里巴巴网站工作流程吉林做网站哪家好
  • 游戏网站建设宁波大型网站推广服务
  • 石家庄电子商务网站建设怎么创一个网站赚钱
  • 网站漂浮广告效果厦门市建设局网站住房保障专栏
  • 做繁体书的网站新冠2024中国又要封城了