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

推荐家居网站建设平面设计网站建设

推荐家居网站建设,平面设计网站建设,阳谷企业做网站推广,入群修改网站后台目录 概述 认证授权及鉴权 Shiro框架的核心组件 基本流程 spring bootshiromybatisPlus...实现用户登录 step1:准备工作 (1)坐标 (2)连接数据库 (3)JavaBean (4)dao数据访问层 (5)密码工具类 DigestsUtil (6)配置类 step2#xff1a;认证功能 step3:授权鉴权 概述…目录 概述 认证授权及鉴权 Shiro框架的核心组件 基本流程 spring bootshiromybatisPlus...实现用户登录 step1:准备工作 (1)坐标 (2)连接数据库 (3)JavaBean (4)dao数据访问层 (5)密码工具类 DigestsUtil (6)配置类 step2认证功能 step3:授权鉴权 概述 shiro是apache下一个开源框架它将软件系统的安全认证功能抽离出来组成一个通用的安全认证框架其功能主要有身份认证授权鉴权会话管理等功能。 认证授权及鉴权 对于认证授权及鉴权可以通过这样一个例子来理解比如说我买了一张去国外的机票现在要登机那我在取机票的时候出示的身份证就是认证的过程工作人员在核实你确实是本人之后会把机票给你这个就是授权当你拿着张机票去登记的时候工作人员还要查你的机票看你是不是我这个航班的机票这个就是鉴权。理解之后再看下面的概念就很具体了。 身份认证是指判断一个用户是否为合法用户的过程最常用的身份认证方式是系统通过判断用户输入的用户名密码和数据库中存储的用户名密码是否一致。由此确认该用户是否为合法用户。 授权也叫访问控制它是指控制谁能够访问哪些资源。用户认证成功后系统会为其分配对应的权限访问资源时会校验其是否有权限访问这个校验的过程就是鉴权。 Shiro框架的核心组件 Subject(主体) 即外部应用与subject进行交互subject将用户作为当前操作的主体这个主体可以是一 个通过浏览器请求的用户也可能是一个运行的程序 。比如说我今天要做一个登录功能的认证那我的Subject就是当前登录的用户。 SecurityManager(权限管理器) 权限管理器是Shiro的核心负责管理所有Subject并通过Authenticator完成认证以及Authorizer完成授权。 Authenticator(认证器) 登录时进行身份认证 Authorizer(授权器) 当用户通过认证访问资源时对用户们进行授权操作 Realm(数据源) Realm用于完成数据库的读取并在其中完成授权校验相关操作 基本流程 1、首先调用Subject.isPermitted/hasRole接口其会委托给SecurityManager。 2、SecurityManager接着会委托给内部组件Authorizer 3、Authorizer再将其请求委托给我们的Realm去做Realm才是真正干活的 4、Realm将用户请求的参数封装成权限对象。再从我们重写的doGetAuthorizationInfo方法中获取从 数据库中查询到的权限集合。 5、Realm将用户传入的权限对象与从数据库中查出来的权限对象进行一一对比。如果用户传入的 权限对象在从数据库中查出来的权限对象中则返回true否则返回false。 进行授权操作的前提用户必须通过认证。 OK理论结束实践开始。。。。 spring bootshiromybatisPlus...实现用户登录 step1:准备工作 在这一部分需要先搭建一个项目的基本框架与数据库的交互以及数据库表。在数据库方面一共需要五张表表的结构在级联查询中已经提到这里不再赘述链接附在这里CSDN 需要特别关注一点的是对于表中密码这部分的数据我使用sha-1算法进行了加密一部分原因是为了安全系数更高些另一部分原因是shiro框架支持多种算法例如sha系列算法以及md5Hashmd2Hash在这里刚好也使用一下。 (1)坐标 首先需要搭建一个springBoot 项目然后添加需要的坐标比如数据持久层的mybatisPlus,管理javaBean的lombok,以及shiro框架相关坐标 propertiesjava.version1.8/java.versionshiro.version1.3.2/shiro.version/propertiesdependencies!--mybatis--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.3/version/dependency!--mysql--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.28/version/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.28/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-core/artifactIdversion${shiro.version}/version/dependencydependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-spring/artifactIdversion${shiro.version}/version/dependencydependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-web/artifactIdversion${shiro.version}/version/dependencydependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-ehcache/artifactIdversion${shiro.version}/version/dependency/dependencies (2)连接数据库 在resource资源文件下的application.properties文件中配置4想数据库连接的基本信息 (3)JavaBean 作用ORM架构中的O,与数据库表中的字段进行一一对应。 在数据库中我们设计了5张表但在实体类这里不涉及关系表关系表只在查数据的时候使用比如我在判断该用户有没有某种权限的时候根据登录用户输入的用户名查询用户的基本信息拿着基本信息中的id查询用户权限这个时候就需要使用到关系表 (4)dao数据访问层 数据的交互基于两个查询操作一个是查询基本信息也就是user表总的信息另一个是查询详细信息包括角色信息和权限信息 (5)密码工具类 DigestsUtil 作用获取明文密码的密文和盐值这是由于数据库中没有数据需要先造几条数据供使用 对于输入的明文在获取密文密码前需要先获取盐值所以调用generateSalt方法生成随机的盐值密文。其次调用show方法进行加密。然后存到map集合中进行返回到这里我们需要做的就是把数据存到数据库中。 public class DigestsUtil { //确定要使用的加密算法public static final String SHA1 SHA-1; //加密次数public static final Integer COUNTS 369;/*** Description sha1方法根据明文和盐值进行加密* param input 需要散列字符串* param salt 盐字符串* return*/public static String show(String input, String salt) {return new SimpleHash(SHA1, input, salt,COUNTS).toString();}/*** Description 随机获得salt字符串* return*/public static String generateSalt(){SecureRandomNumberGenerator randomNumberGenerator new SecureRandomNumberGenerator();return randomNumberGenerator.nextBytes().toHex();}/*** Description 生成密码字符密文和salt密文* param* return*/public static MapString,String entryptPassword(String passwordPlain) {MapString,String map new HashMap();String salt generateSalt();String password show(passwordPlain,salt);map.put(salt, salt);map.put(password, password);return map;}public static void main(String[] args) { //用户测试数据String name xixi;String pwd 12345;Map map entryptPassword(pwd);System.out.println(map.toString());} }(6)配置类 作用定义shiro框架的基本配置包括拦截规则登录页面等等具体功能在方法上有备注 Configuration public class ShiroConfiguration {/*** 1.创建shiro自带cookie对象*/Beanpublic SimpleCookie sessionIdCookie(){SimpleCookie simpleCookie new SimpleCookie();simpleCookie.setName(ShiroSession);return simpleCookie;}//2.创建自定义的realm用于登录认证和授权Beanpublic MyRealm getRealm() {return new MyRealm();}/*** 3.创建会话管理器*/Beanpublic DefaultWebSessionManager sessionManager(){DefaultWebSessionManager sessionManager new DefaultWebSessionManager();sessionManager.setSessionValidationSchedulerEnabled(false);sessionManager.setSessionIdCookieEnabled(true);sessionManager.setSessionIdCookie(sessionIdCookie());sessionManager.setGlobalSessionTimeout(3600000);return sessionManager;}//4.创建安全管理器Beanpublic SecurityManager defaultWebSecurityManager() {DefaultWebSecurityManager securityManager new DefaultWebSecurityManager();securityManager.setRealm(getRealm());securityManager.setSessionManager(sessionManager());return securityManager;}/*** 5.保证实现了Shiro内部lifecycle函数的bean执行*/Bean(name lifecycleBeanPostProcessor)public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {return new LifecycleBeanPostProcessor();}/*** 6.开启对shiro注解的支持* AOP式方法级权限检查*/BeanDependsOn(lifecycleBeanPostProcessor)public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator new DefaultAdvisorAutoProxyCreator();defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);return defaultAdvisorAutoProxyCreator;}/*** 7.配合DefaultAdvisorAutoProxyCreator实现使用注解进行权限校验例如RequireRoles、RequirePermissions等*/Beanpublic AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor new AuthorizationAttributeSourceAdvisor();authorizationAttributeSourceAdvisor.setSecurityManager(defaultWebSecurityManager());return authorizationAttributeSourceAdvisor;}//8.配置shiro的过滤器工厂再web程序中shiro进行权限控制全部是通过一组过滤器集合进行控制Beanpublic ShiroFilterFactoryBean shiroFilter() {//1.创建过滤器工厂ShiroFilterFactoryBean filterFactory new ShiroFilterFactoryBean();//2.设置安全管理器filterFactory.setSecurityManager(defaultWebSecurityManager());//3.通用配置跳转登录页面为授权跳转的页面filterFactory.setLoginUrl(/autherror);//跳转url地址//4.设置过滤器集合//key 拦截的url地址//value 过滤器类型MapString,String filterMap new LinkedHashMap();//key请求规则 value过滤器名称filterMap.put(/login,anon);//当前请求地址可以匿名访问filterMap.put(/user/**,authc);//当前请求地址必须认证之后可以访问//在过滤器工程内设置系统过滤器filterFactory.setFilterChainDefinitionMap(filterMap);return filterFactory;}}至此准备阶段就结束了可以进行shiro框架功能的测试。 step2认证功能 认证流程在前文已经叙述过这里不再赘述下文主要描述怎么利用shiro实现认证。首先用户在登录界面输入用户名和密码因为我们在数据库里存的是密文所以需要先判断该用户名和密码,这个时候根据我们在配置类中自定义的Realm类中的doGetAuthenticationInfo方法进行认证 Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //将参数AuthenticationToken 转换为用户名密码令牌UsernamePasswordToken token(UsernamePasswordToken)authenticationToken; //获取令牌中的用户名String username token.getUsername(); //按照该用户名查询数据库若数据库中没有数据说明该用户不存在返回null若存在进行验证User user userService.findUserByName(username);if(user!null){ //SimpleAuthenticationInfo该类是shiro提供的对象可以根据传入的参数进行解密操作 /**参数含义 *参数1安全对象后续用于鉴权 *参数2从数据库中查到的密文密码 *参数3从数据库中查到的盐值的字节数组 *参数4realm类名 */SimpleAuthenticationInfo info new SimpleAuthenticationInfo(user, user.getPassword(), ByteSource.Util.bytes(user.getSalt()), myRealm);return info;}return null;} 这个时候就有人有问题了这个参数authenticationToken里面的数据是怎么来传过来的解释一下在我们访问登录页面输入数据时在控制层中会先进行判断若不为空将数据封装成UsernamePasswordToken对象再获取Subject对象调用login方法进行登录验证否则处理空异常。 这个时候又有人会有问题了之前设置了加密算法和加密次数那shiro框架在解密的时候怎么知道你用的是哪个加密算法加密了多少次啊再解释一下在Realm类中其实还有一个方法initCredentialsMatcher(),它是用来指导密码的加密算法和迭代次数的写完后告诉shiro你的这个实现类是谁shiro就知道该去回调哪个方法了。 step3:授权鉴权 这个功能主要是用户在访问某个功能鉴权的的时候使用也就说每当我访问一个新的功能进行鉴权的时候都需要重新执行授权方法该方法同样定义在Realm类中 Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { //获取认证通过的用户对象User user (User) principalCollection.getPrimaryPrincipal(); //根据用户id查询该用户的详细信息User userDetail userService.findUserDetailById(user.getId()); //定义存储角色的集合HashSetString roles new HashSet(); //定义存储权限的集合HashSetString perms new HashSet(); //对角色集合进行遍历将每一个角色对应的的权限存入权限集合for (Role role : userDetail.getRoles()) {for (Permission perm : role.getPermissions()) {perms.add(perm.getCode());}} //封装角色权限对象返回SimpleAuthorizationInfo info new SimpleAuthorizationInfo();info.setStringPermissions(perms);info.setRoles(roles);return info;} 对于后续的鉴权我使用注解解决 在资源上使用RequiresPermissions注解那么当用户访问该资源时判断用户有没有相应的权限 若有可以访问资源若无抛出异常。对于异常情况的处理使用全局异常处理器ControllerAdvice进行捕获
http://www.huolong8.cn/news/86416/

相关文章:

  • 江阴青阳道路建设网站百度关键词查询工具
  • 郑州外贸网站建设商家免费素材网站下载
  • 百度seo服务公司东营做网站优化公司
  • 北京政平建设投资集团有限公司网站无锡百度信息流
  • 企业自助建站系统 嘉兴网站空间怎么选
  • 有哪些做任务网站会计专业建设规划
  • 男女做暧暧试看网站域名网站做优化外链
  • 济南手机建站价格深圳做网站的网络公
  • 云南网官方网站商城网站建站程序
  • 网站建设ui设计公司wordpress首页置顶文章
  • 广东网站seo营销社区网站的推广方案
  • 吉林市网站推广网站怎么加链接
  • 上海网站建设推荐秒搜科技外贸网站建设公司价格
  • 网站挣钱网网站建设架构书
  • 企业网站兰州建设费用软件开发工具推荐
  • 男孩子和男孩子在一起怎么做网站wordpress搬家 500
  • 网上商城网站开发与建立的意义工作用什么邮箱比较正式
  • 公司网站的意义注册公司的流程及费用
  • 打开网站 磁盘空间不足国产 做 视频网站
  • 网站后台登录域名江宁区住房和城乡建设局网站
  • 网站设计专业公司沈阳市有做网站的公司
  • 基木鱼建站网站建设捌金手指专业9
  • 广州做网站最好的公司快三网站开发
  • 网站上的导航栏怎么做云南省网站建设收费调查报告论文
  • 网站背景设计中企动力是正规公司吗
  • 电商erp网站开发全国中小企业服务平台
  • 苏州网站建设介绍网站建设公司运营模式
  • 个人网站可以做淘宝客好的营销网站设计公司
  • 宜宾市做网站多少钱成都专业网站制作建设
  • 以绿色为主色调的网站常州网站开发公司