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

怎么注册企业网站域名重庆建设工程施工安全管理信息网

怎么注册企业网站域名,重庆建设工程施工安全管理信息网,外贸网站品牌官网建设,淘宝请人做网站被骗Java 程序员如何使用 Shiro 框架一、架构要学习如何使用Shiro必须先从它的架构谈起#xff0c;作为一款安全框架Shiro的设计相当精妙。Shiro的应用不依赖任何容器#xff0c;它也可以在JavaSE下使用。但是最常用的环境还是JavaEE。下面以用户登录为例#xff1a;1、使用用户… Java 程序员如何使用 Shiro 框架一、架构要学习如何使用Shiro必须先从它的架构谈起作为一款安全框架Shiro的设计相当精妙。Shiro的应用不依赖任何容器它也可以在JavaSE下使用。但是最常用的环境还是JavaEE。下面以用户登录为例1、使用用户的登录信息创建令牌UsernamePasswordToken token  new UsernamePasswordToken(username, password);token可以理解为用户令牌登录的过程被抽象为Shiro验证令牌是否具有合法身份以及相关权限。2、执行登陆动作SecurityUtils.setSecurityManager(securityManager); // 注入SecurityManagerSubject subject SecurityUtils.getSubject(); // 获取Subject单例对象subject.login(token); // 登陆Shiro的核心部分是SecurityManager它负责安全认证与授权。Shiro本身已经实现了所有的细节用户可以完全把它当做一个黑盒来使用。SecurityUtils对象本质上就是一个工厂类似Spring中的ApplicationContext。Subject是初学者比较难于理解的对象很多人以为它可以等同于User其实不然。Subject中文翻译项目而正确的理解也恰恰如此。它是你目前所设计的需要通过Shiro保护的项目的一个抽象概念。通过令牌(token)与项目(subject)的登陆(login)关系Shiro保证了项目整体的安全。3、判断用户Shiro本身无法知道所持有令牌的用户是否合法因为除了项目的设计人员恐怕谁都无法得知。因此Realm是整个框架中为数不多的必须由设计者自行实现的模块当然Shiro提供了多种实现的途径本文只介绍最常见也最重要的一种实现方式——数据库查询。4、两条重要的英文我在学习Shiro的过程中遇到的第一个障碍就是这两个对象的英文名称AuthorizationInfoAuthenticationInfo。不用怀疑自己的眼睛它们确实长的很像不但长的像就连意思都十分近似。在解释它们前首先必须要描述一下Shiro对于安全用户的界定和大多数操作系统一样。用户具有角色和权限两种最基本的属性。例如我的Windows登陆名称是learnhow它的角色是administrator而administrator具有所有系统权限。这样learnhow自然就拥有了所有系统权限。那么其他人需要登录我的电脑怎么办我可以开放一个guest角色任何无法提供正确用户名与密码的未知用户都可以通过guest来登录而系统对于guest角色开放的权限极其有限。同理Shiro对用户的约束也采用了这样的方式。AuthenticationInfo代表了用户的角色信息集合AuthorizationInfo代表了角色的权限信息集合。如此一来当设计人员对项目中的某一个url路径设置了只允许某个角色或具有某种权限才可以访问的控制约束的时候Shiro就可以通过以上两个对象来判断。说到这里大家可能还比较困惑。先不要着急继续往后看就自然会明白了。二、实现Realm如何实现Realm是本文的重头戏也是比较费事的部分。这里大家会接触到几个新鲜的概念缓存机制、散列算法、加密算法。由于本文不会专门介绍这些概念所以这里仅仅抛砖引玉的谈几点能帮助大家更好的理解Shiro即可。1、缓存机制Ehcache是很多Java项目中使用的缓存框架Hibernate就是其中之一。它的本质就是将原本只能存储在内存中的数据通过算法保存到硬盘上再根据需求依次取出。你可以把Ehcache理解为一个Map对象通过put保存对象再通过get取回对象。xml version1.0 encodingUTF-8?ehcache nameshirocachediskStore pathjava.io.tmpdir /cache namepasswordRetryCachemaxEntriesLocalHeap2000eternalfalsetimeToIdleSeconds1800timeToLiveSeconds0overflowToDiskfalsestatisticstruecacheehcache以上是ehcache.xml文件的基础配置timeToLiveSeconds为缓存的最大生存时间timeToIdleSeconds为缓存的最大空闲时间当eternal为false时ttl和tti才可以生效。更多配置的含义大家可以去网上查询。2、散列算法与加密算法md5是本文会使用的散列算法加密算法本文不会涉及。散列和加密本质上都是将一个Object变成一串无意义的字符串不同点是经过散列的对象无法复原是一个单向的过程。例如对密码的加密通常就是使用散列算法因此用户如果忘记密码只能通过修改而无法获取原始密码。但是对于信息的加密则是正规的加密算法经过加密的信息是可以通过秘钥解密和还原。3、用户注册请注意虽然我们一直在谈论用户登录的安全性问题但是说到用户登录首先就是用户注册。如何保证用户注册的信息不丢失不泄密也是项目设计的重点。public class PasswordHelper {private RandomNumberGenerator randomNumberGenerator  new SecureRandomNumberGenerator();private String algorithmName  md5;private final int hashIterations  2;public void encryptPassword(User user) {// User对象包含最基本的字段Username和Password       user.setSalt(randomNumberGenerator.nextBytes().toHex());// 将用户的注册密码经过散列算法替换成一个不可逆的新密码保存进数据散列过程使用了盐       String newPassword  new SimpleHash(algorithmName, user.getPassword(),               ByteSource.Util.bytes(user.getCredentialsSalt()), hashIterations).toHex();       user.setPassword(newPassword);   }}如果你不清楚什么叫加盐可以忽略散列的过程只要明白存储在数据库中的密码是根据户注册时填写的密码所产生的一个新字符串就可以了。经过散列后的密码替换用户注册时的密码然后将User保存进数据库。剩下的工作就丢给UserService来处理。那么这样就带来了一个新问题既然散列算法是无法复原的当用户登录的时候使用当初注册时的密码我们又应该如何判断答案就是需要对用户密码再次以相同的算法散列运算一次再同数据库中保存的字符串比较。4、匹配CredentialsMatcher是一个接口功能就是用来匹配用户登录使用的令牌和数据库中保存的用户信息是否匹配。当然它的功能不仅如此。本文要介绍的是这个接口的一个实现类HashedCredentialsMatcherpublic class RetryLimitHashedCredentialsMatcher extends HashedCredentialsMatcher {// 声明一个缓存接口这个接口是Shiro缓存管理的一部分它的具体实现可以通过外部容器注入private Cache passwordRetryCache;public RetryLimitHashedCredentialsMatcher(CacheManager cacheManager) {       passwordRetryCache cacheManager.getCache(passwordRetryCache);   }Overridepublic boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {       String username (String) token.getPrincipal();       AtomicInteger retryCount passwordRetryCache.get(username);if (retryCount  null) {           retryCount  new AtomicInteger(0);           passwordRetryCache.put(username, retryCount);       }// 自定义一个验证过程当用户连续输入密码错误5次以上禁止用户登录一段时间if (retryCount.incrementAndGet()  5) {throw new ExcessiveAttemptsException();       }boolean match  super.doCredentialsMatch(token, info);if (match) {           passwordRetryCache.remove(username);       }return match;   }}可以看到这个实现里设计人员仅仅是增加了一个不允许连续错误登录的判断。真正匹配的过程还是交给它的直接父类去完成。连续登录错误的判断依靠Ehcache缓存来实现。显然match返回true为匹配成功。5、获取用户的角色和权限信息说了这么多才到我们的重点Realm如果你已经理解了Shiro对于用户匹配和注册加密的全过程真正理解Realm的实现反而比较简单。我们还得回到上文提及的两个非常类似的对象AuthorizationInfo和AuthenticationInfo。因为Realm就是提供这两个对象的地方。public class UserRealm extends AuthorizingRealm {// 用户对应的角色信息与权限信息都保存在数据库中通过UserService获取数据private UserService userService  new UserServiceImpl();/**    * 提供用户信息返回权限信息    */Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String username (String) principals.getPrimaryPrincipal();       SimpleAuthorizationInfo authorizationInfo  new SimpleAuthorizationInfo();// 根据用户名查询当前用户拥有的角色       Set roles userService.findRoles(username);       SetString roleNames  new HashSetString();for (Role role : roles) {           roleNames.add(role.getRole());       }// 将角色名称提供给info       authorizationInfo.setRoles(roleNames);// 根据用户名查询当前用户权限       Set permissions userService.findPermissions(username);       SetString permissionNames  new HashSetString();for (Permission permission : permissions) {           permissionNames.add(permission.getPermission());       }// 将权限名称提供给info       authorizationInfo.setStringPermissions(permissionNames);return authorizationInfo;   }/**    * 提供账户信息返回认证信息    */Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String username (String) token.getPrincipal();       User user userService.findByUsername(username);if (user  null) {// 用户名不存在抛出异常throw new UnknownAccountException();       }if (user.getLocked()  0) {// 用户被管理员锁定抛出异常throw new LockedAccountException();       }       SimpleAuthenticationInfo authenticationInfo  new SimpleAuthenticationInfo(user.getUsername(),               user.getPassword(), ByteSource.Util.bytes(user.getCredentialsSalt()), getName());return authenticationInfo;   }}根据Shiro的设计思路用户与角色之前的关系为多对多角色与权限之间的关系也是多对多。在数据库中需要因此建立5张表分别是用户表(存储用户名密码盐等)角色表(角色名称相关描述等)权限表(权限名称相关描述等)用户-角色对应中间表(以用户ID和角色ID作为联合主键)角色-权限对应中间表(以角色ID和权限ID作为联合主键)具体dao与service的实现本文不提供。总之结论就是Shiro需要根据用户名和密码首先判断登录的用户是否合法然后再对合法用户授权。而这个过程就是Realm的实现过程。6、会话用户的一次登录即为一次会话Shiro也可以代替Tomcat等容器管理会话。目的是当用户停留在某个页面长时间无动作的时候再次对任何链接的访问都会被重定向到登录页面要求重新输入用户名和密码而不需要程序员在Servlet中不停的判断Session中是否包含User对象。启用Shiro会话管理的另一个用途是可以针对不同的模块采取不同的会话处理。以淘宝为例用户注册淘宝以后可以选择记住用户名和密码。之后再次访问就无需登陆。但是如果你要访问支付宝或购物车等链接依然需要用户确认身份。当然Shiro也可以创建使用容器提供的Session最为实现。三、与SpringMVC集成有了注册模块和Realm模块的支持下面就是如何与SpringMVC集成开发。有过框架集成经验的同学一定知道所谓的集成基本都是一堆xml文件的配置Shiro也不例外。1、配置前端过滤器先说一个题外话Filter是过滤器interceptor是拦截器。前者基于回调函数实现必须依靠容器支持。因为需要容器装配好整条FilterChain并逐个调用。后者基于代理实现属于AOP的范畴。如果希望在WEB环境中使用Shiro必须首先在web.xml文件中配置熟悉Spring配置的同学可以重点看有绿字注释的部分这里是使Shiro生效的关键。由于项目通过Spring管理因此所有的配置原则上都是交给Spring。DelegatingFilterProxy的功能是通知Spring将所有的Filter交给ShiroFilter管理。接着在classpath路径下配置spring-shiro-web.xml文件beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:phttp://www.springframework.org/schema/pxmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beans                       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd                       http://www.springframework.org/schema/context                       http://www.springframework.org/schema/context/spring-context-3.1.xsd                       http://www.springframework.org/schema/mvc                       http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdbean idcacheManager classorg.apache.shiro.cache.ehcache.EhCacheManagerproperty namecacheManagerConfigFile valueclasspath:ehcache.xml /beanbean idcredentialsMatcher classutils.RetryLimitHashedCredentialsMatcherconstructor-arg refcacheManager /property namehashAlgorithmName valuemd5 /property namehashIterations value2 /property namestoredCredentialsHexEncoded valuetrue /beanbean iduserRealm classutils.UserRealmproperty namecredentialsMatcher refcredentialsMatcher /beanbean idsecurityManager classorg.apache.shiro.web.mgt.DefaultWebSecurityManagerproperty namerealm refuserRealm /beanbean idshiroFilter classorg.apache.shiro.spring.web.ShiroFilterFactoryBeanproperty namesecurityManager refsecurityManager /property nameloginUrl value/ /property nameunauthorizedUrl value/ /property namefilterChainDefinitionsvalue               /authc/admin roles[admin]               /authc/** authc               /** anonvaluepropertybeanbean idlifecycleBeanPostProcessor classorg.apache.shiro.spring.LifecycleBeanPostProcessor /beans需要注意filterChainDefinitions过滤器中对于路径的配置是有顺序的当找到匹配的条目之后容器不会再继续寻找。因此带有通配符的路径要放在后面。三条配置的含义是 /authc/admin需要用户有用admin权限/authc/**用户必须登录才能访问/**其他所有路径任何人都可以访问说了这么多大家一定关心在Spring中引入Shiro之后到底如何编写登录代码呢。Controllerpublic class LoginController {Autowiredprivate UserService userService;RequestMapping(login)public ModelAndView login(RequestParam(username) String username, RequestParam(password) String password) {       UsernamePasswordToken token  new UsernamePasswordToken(username, password);       Subject subject SecurityUtils.getSubject();try {           subject.login(token);       } catch (IncorrectCredentialsException ice) {// 捕获密码错误异常           ModelAndView mv  new ModelAndView(error);           mv.addObject(message, password error!);return mv;       } catch (UnknownAccountException uae) {// 捕获未知用户名异常           ModelAndView mv  new ModelAndView(error);           mv.addObject(message, username error!);return mv;       } catch (ExcessiveAttemptsException eae) {// 捕获错误登录过多的异常           ModelAndView mv  new ModelAndView(error);           mv.addObject(message, times error);return mv;       }       User user userService.findByUsername(username);       subject.getSession().setAttribute(user, user);return new ModelAndView(success);   }}登录完成以后当前用户信息被保存进Session。这个Session是通过Shiro管理的会话对象要获取依然必须通过Shiro。传统的Session中不存在User对象。ControllerRequestMapping(authc)public class AuthcController {// /authc/** authc 任何通过表单登录的用户都可以访问RequestMapping(anyuser)public ModelAndView anyuser() {       Subject subject SecurityUtils.getSubject();       User user (User) subject.getSession().getAttribute(user);       System.out.println(user);return new ModelAndView(inner);   }// /authc/admin user[admin] 只有具备admin角色的用户才可以访问否则请求将被重定向至登录界面RequestMapping(admin)public ModelAndView admin() {       Subject subject SecurityUtils.getSubject();       User user (User) subject.getSession().getAttribute(user);       System.out.println(user);return new ModelAndView(inner);   }}
http://www.zqtcl.cn/news/364890/

相关文章:

  • 品牌建设+网站网站建设 淘宝客末班
  • 建设商业网站学校建设门户网站的好处
  • 男女朋友在一起做那个的网站公司建设网站
  • 营销型网站的类型有哪些相册网站怎么做
  • 河南建设监理协会网站电话erp管理系统官网
  • 视频网站seo实战做企业网站一般用什么服务器
  • icp备案 网站负责人免费直播sdk
  • 网站制作和如何推广动画专业学什么
  • 北京一家专门做会所的网站基于ssh框架的网站开发流程
  • 可以在自己的电脑上做网站吗陕西商城网站建设
  • 深圳网站建设工作室郴州有什么好玩的地方
  • 用dw做的网站怎么发到网上竹妃怎么在公众号里做网站
  • 杭州网站优化搜索黑龙江公共资源交易网官网
  • 动易网站 首页模板修改平台网站是什么
  • 营销网站更受用户欢迎的原因是英文网站的建设意义
  • 学网站建设基础河北省建设网站的网站首页
  • 铜仁市住房和城乡建设部网站延边有没有做网站的
  • 如何做ppt的模板下载网站移动端网站的优点
  • 网站域名没有实名认证微信平台开发技术
  • 自己用电脑做虚拟机怎么建网站个人网站 icp 代理
  • 嘉兴网站建设999 999中国建设招标网是私人网站吗
  • 网站程序设置主页面零基础学wordpress pdf下载
  • 网站代码优化有哪些专做立体化的网站
  • 单县网站定制培训机构专业
  • 网站防红链接怎么做网站建设中提示页面
  • 网站开发和游戏开发的区别互联网服务平台投诉
  • 杭州定制网站公司出名的设计网站
  • 网站查询访问注册电气工程师考试
  • 北京企业网站推广哪家公司好电商平台代运营
  • 北京快速建站模板信息管理系统网站开发