今天就跟大家聊聊有关如何在原有的框架中集成shiro,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

宁海网站建设公司成都创新互联公司,宁海网站设计制作,有大型网站制作公司丰富经验。已为宁海上千家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的宁海做网站的公司定做!
今天的任务是在原有的框架中集成shiro
  1.shiro的认识
> 权限框架(提供的易用的API,功能强大)
   1.1 和Spring security区别
 
框架       | shiro | Spring security
          ---|------| ---
  易用性  |   √    | X
  粒度      | 粗     | 细(强大)
   1.2 shiro的四大基石
> 身份验证、授权、密码学和会话管理
> securityManager:核心对象  realm:获取数据接口
  2.shiro的核心api
   2.1 操作之前,先得到securityManager对象
```
//一.创建我们自己的Realm MyRealm myRealm = new MyRealm(); //二.搞一个核心对象: DefaultSecurityManager securityManager = new DefaultSecurityManager(); securityManager.setRealm(myRealm); //三.把securityManager放到上下文中 SecurityUtils.setSecurityManager(securityManager);
```
## 2.2 我们使用过的方法
```
//1.拿到当前用户
Subject currentUser = SecurityUtils.getSubject();
//2.判断是否登录
currentUser.isAuthenticated();
//3.登录(需要令牌的)
/**
    UnknownAccountException:用户名不存在
    IncorrectCredentialsException:密码错误
    AuthenticationException:其它错误
*/
 UsernamePasswordToken token = new UsernamePasswordToken("admin", "123456");
 currentUser.login(token);
 
//4.判断是否是这个角色/权限
currentUser.hasRole("角色名")
currentUser.isPermitted("权限名")
```
# 3.密码加密功能
```
/**
 * String algorithmName, Object source, Object salt, int hashIterations)
 * 第一个参数algorithmName:加密算法名称
 * 第二个参数source:加密原密码
 * 第三个参数salt:盐值
 * 第四个参数hashIterations:加密次数
 */
SimpleHash hash = new SimpleHash("MD5","123456","itsource",10);
System.out.println(hash.toHex());
```
# 4.自定义Realm
> 继承AuthorizingRealm
>> 实现两个方法:doGetAuthorizationInfo(授权)  /doGetAuthenticationInfo(登录认证)
```
//身份认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    //1.拿用户名与密码
    UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken;
    String username = token.getUsername();
    //2.根据用户名拿对应的密码
    String password = getByName(username);
    if(password==null){
        return null; //返回空代表用户名有问题
    }
    //返回认证信息
    //准备盐值
    ByteSource salt = ByteSource.Util.bytes("asdf");
    //密码是shiro自己进行判断
    SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username,password,salt,getName());
    return authenticationInfo;
}
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    //拿到用户名  Principal:主体(用户对象/用户名)
    String username = (String)principalCollection.getPrimaryPrincipal();
    //拿到角色
    Set roles = findRolesBy(username);
    //拿到权限
    Set permis = findPermsBy(username);
    //把角色权限交给用户
    SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
    authorizationInfo.setRoles(roles);
    authorizationInfo.setStringPermissions(permis);
    return authorizationInfo;
}  
> 注意:如果我们的密码加密,应该怎么判断(匹配器)
//一.创建我们自己的Realm
MyRealm myRealm = new MyRealm();
//创建一个凭证匹配器(无法设置盐值)
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
//  使用MD5的方式比较密码
matcher.setHashAlgorithmName("md5");
// 设置编码的迭代次数
matcher.setHashIterations(10);
//设置凭证匹配器(加密方式匹配)
myRealm.setCredentialsMatcher(matcher);
```
# 5.集成Spring
> 去找:shiro-root-1.4.0-RC2\samples\spring
## 5.1 导包
```
org.apache.shiro shiro-all 1.4.0 pom org.apache.shiro shiro-spring 1.4.0 
## 5.2 web.xml> 这个过滤器是一个代码(只关注它的名称)
 
shiroFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroFilter /* 
## 5.3 application-shiro.xml
> 在咱们的application引入
`
> 是从案例中拷备过来,进行了相应的修改```
```
5.4 获取Map过滤
> 注意,返回的Map必需是有序的(LinkedHashMap)```
public class FilterChainDefinitionMapFactory {
    /**
     * 后面这个值会从数据库中来拿
     * /s/login.jsp = anon
     * /login = anon
     * /s/permission.jsp = perms[user:index]
     * /depts/index = perms[depts:index]
     * /** = authc
     */
    public Map createFilterChainDefinitionMap(){
        //注:LinkedHashMap是有序的
        Map filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/s/login.jsp", "anon");
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/s/permission.jsp", "perms[user:index]");
        filterChainDefinitionMap.put("/depts/index", "perms[depts:index]");
        filterChainDefinitionMap.put("/**", "authc");
        return filterChainDefinitionMap;
    }
}  今日重点 : 对securityManage 对象的获取,在权限认证步骤中需要的信息传递(用户,角色,权限)
细节 : 对于在设置权限列表时需要注意顺序,-----放行在前->权限在后->最后同一拦截 /** = authc
看完上述内容,你们对如何在原有的框架中集成shiro有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。
分享题目:如何在原有的框架中集成shiro
URL分享:http://www.cqwzjz.cn/article/pegoci.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 