智能销售系统day5

Shiro

1.Shiro

概述:Apache Shiro是一个强大且易用的Java安全框架,有身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序

Spring security:同样是一个java安全框架,但他是一个重量级框架,复杂,麻烦,细粒度的权限控制,配置细节更多
Shiro:是一个轻量级的java安全框架,简单,粗粒度的权限控制

Shiro的四大基石:
身份验证(登录Authentication)
授权(权限验证Authorization)
会话管理
加密(密码学)

2.Shiro代码实现

  1. 导包
    shiro-core shiro的核心jar包
    commons-logging 提供日志的jar包
    junit 测试包

  2. 准备shiro的资源文件
    shiro.ini文件(对拷备过来的数据进行了解释),文件名后缀为ini 所有的用户与对应的用户密码 ,用户的角色[users]
    root用户有一个密码是secret,他的角色是admin
    root = 123456, admin
    guest = guest, guest
    user = user , user

所有的用户的角色

[roles]
admin这个角色有所有权限功能
admin = *
#user这个角色可以操作所有的lightsaber权限功能
user = lightsaber:*
#guest这个角色可以操作lightsber下面的search方法
guest = lightsaber:search

  1. 登录

    1. 获取核心管理对象
      这个方法已经过时,获取核心管理对象工厂并读取资源配置文件
      IniSecurityManagerFactory factory = new IniSecurityManagerFactory(“classpath:shiro.ini”);
      再通过核心管理对象工厂来获取核心管理对象
      SecurityManager securityManager = factory.getInstance();
      新方法直接创建核心管理对象,不再通过工厂
      DefaultSecurityManager securityManager = new DefaultSecurityManager();
    2. 将securityManager放到项目的上下文 为了在任何地方都可以使用它
      SecurityUtils.setSecurityManager(securityManager);
    3. 获取当前的用户(subject:操作当前系统的用户)
      Subject currentUser = SecurityUtils.getSubject();
    4. 判断当前用户是否登录成功
      currentUser.isAuthenticated();
    5. 如果没有登录,可能是一个游客,那么就让它登录
      登录前需要获取用户名与密码令牌
      UsernamePasswordToken token = new UsernamePasswordToken(“root”, “123456”);
      进行登录
      currentUser.login(token);
    6. 获取登录验证信息对象
      将用户名与密码放进去,shiro会自动的比较获取的密码与你传过来的密码
      如果有盐值需要匹配,直接将盐值也放进去
      SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username,password,salt,“myRealm”);
    7. 登录错误会抛出3个异常
      UnknownAccountException uae 用户名错误
      IncorrectCredentialsException ice 密码错误
      AuthenticationException ae 未知错误
  2. 授权
    在这里是使用的假数据来模拟数据库

    1. 获取认证过后的用户名
      String username = (String)principalCollection.getPrimaryPrincipal();
    2. 根据用户名获取角色信息
      Set rolesByUsername = getRolesByUsername(username);
    3. 根据用户名获取权限信息
      Set permissionsByUsername = getPermissionsByUsername(username);
    4. 获取授权验证信息对象
      SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
    5. 授权角色,权限信息
      simpleAuthorizationInfo.setRoles(rolesByUsername);
      simpleAuthorizationInfo.setStringPermissions(permissionsByUsername);
    6. 通过当前用户判断是否是这个角色
      currentUser.hasRole(“admin”)
    7. 通过当前用户判断是否拥有这个权限
      currentUser.isPermitted(“employee.save”)
  3. 加密加盐

    1. shiro中密码加密
      第一个参数algorithmName:加密算法名称”MD5”
      第二个参数source:原来的密码”123”
      第三个参数salt:加盐,盐值
      第四个参数hashIterations:加密的次数
      SimpleHash simpleHash = new SimpleHash(“MD5”,“123”,“itsource”,10);
    2. 密码加密需要设置密码匹配器
      获取密码匹配器对象
      HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
      匹配器使用的算法(md5)
      matcher.setHashAlgorithmName(“md5”);
      加密算法的迭代次数(10)
      matcher.setHashIterations(10);
      如果是自定义realm需要建立关系
      myRealm.setCredentialsMatcher(matcher);
    3. 加盐需要盐值匹配
      加盐值需一个ByteSource对象,而Shiro提供了一个ByteSource对象给咱们
      ByteSource salt = ByteSource.Util.bytes(“itsource”); //盐值匹配
      匹配后需要加入到登录验证信息对象
      SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username,password,salt,“myRealm”);
  4. 自定义Realm
    创建一个类直接继承AuthorizingRealm接口(里面包含身份认证与授权两个方法)
    授权
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    //授权,最后将授权角色、权限信息后的授权对象返回出去
    return simpleAuthorizationInfo;
    }
    登录
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    //登录认证
    /**
    注意:1.如果加盐,需要盐值匹配,将盐值放入到登录信息对象中
    2.根据前台传过来的用户名到数据库中查看是否有对应的密码,如果没有则表示这个用 户不存在
    if(password==null){
    return null; //返回null则会直接抛出用户名错误异常
    }
    */
    }

  5. Shiro与Spring的集成
    概述:
    我们的项目基本都是通过Spring来管理bean的,如果要想使用Shiro,那就要把shiro集成到Spring。集成Spring的核心就是把框架的核心类(SecurityManager,Subject,Realm)交给Spring管理

代码实现:

  1. 导入jar包
    shiro-all shiro的支持包
    shiro-spring shiro与spring的集成包

  2. 配置web.xml
    Spring与shiro集成:需要定义一个shiro过滤器(这是一个代理过滤器,它会到spring的配置中找一个名称相同的真实过滤器)


    shiroFilter
    org.springframework.web.filter.DelegatingFilterProxy
    
        targetFilterLifecycle
        true
    



    shiroFilter
    /*

  1. 拷贝shiroSpring的配置文件并集成于Spring


注意:拷贝shiroSpring配置文件后 必须在Spring的配置文件中进行引入
  1. 配置shiro的配置文件
1.获取shiro的核心管理对象



    

2.自定义realm

    
    
        
             
	  
             
	  
        
    

3.shiro中的权限判断支持注解的方式实现



    


4.Shiro真正的功能过滤器 注:名字必须与代理过滤器名字一致

    
    
    
    
    
    
    
    
    






注意:返回的权限是有顺序的,所以必须使用linkedMap

5.权限工厂
public class ShiroFactory {
    public Map createShiroMap(){
        //注:LinkedHashMap是有序的
        Map filterShiroMap = new LinkedHashMap<>();

        filterShiroMap.put("/shiro/login.jsp", "anon");//放行登录页面
        filterShiroMap.put("/login", "anon");//放行登录的控制层
        filterShiroMap.put("/**", "authc");//拦截所有页面与子页面

        return filterShiroMap;
    }
}

你可能感兴趣的:(智能销售系统day5)