找回密码
 立即注册
首页 业界区 安全 shiro--身份授权的基本流程

shiro--身份授权的基本流程

押疙 前天 22:15
身份授权基本流程


  • 先调用Subject.isPermitted/hasRole接口,其会委托给SecurityManager
  • SecurityManager再交给Authorizer
  • Authorizer再交给Realm去做,Realm才是真正干活的
  • Realm将用户请求的参数封装成权限对象。再从我们重写的doGetAuthorizationInfo方法中获取从数据库中查到的权限集合
  • Realm将用户传入的权限和数据库中查到的权限进行对比,如果传入的权限对象在数据库查到的权限集合中,则返回true,否则返回false
demo

DefinitionRealm自定义Realm类
  1. package realm;
  2. import org.apache.shiro.authc.AuthenticationException;
  3. import org.apache.shiro.authc.AuthenticationToken;
  4. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  5. import org.apache.shiro.authc.UnknownAccountException;
  6. import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
  7. import org.apache.shiro.authz.AuthorizationInfo;
  8. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  9. import org.apache.shiro.realm.AuthorizingRealm;
  10. import org.apache.shiro.subject.PrincipalCollection;
  11. import org.apache.shiro.util.ByteSource;
  12. import service.SecurityService;
  13. import service.impl.SecurityServiceImpl;
  14. import tools.DigestsUtil;
  15. import java.util.List;
  16. import java.util.Map;
  17. public class DefinitionRealm extends AuthorizingRealm {
  18.     // 在构造函数中修改密码比较器
  19.     public DefinitionRealm(){
  20.         // 指定密码匹配方式sha1
  21.         HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(DigestsUtil.SHA1);
  22.         // 指定密码迭代次数
  23.         matcher.setHashIterations(DigestsUtil.ITERATIONS);
  24.         // 使用父层方法是匹配方式生效
  25.         setCredentialsMatcher(matcher);
  26.     }
  27.     /***
  28.      *  鉴权方法
  29.      * @param principalCollection
  30.      * @return
  31.      */
  32.     @Override
  33.     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
  34.         // 拿到用户凭证信息
  35.         String loginName = (String) principalCollection.getPrimaryPrincipal();
  36.         // 从数据库中查询对应的角色和权限
  37.         SecurityService securityService = new SecurityServiceImpl();
  38.         List<String> roles = securityService.findRoleByLoginName(loginName);
  39.         List<String> Permissions = securityService.findPermissionByLoginName(loginName);
  40.         // 构建资源校验对象
  41.         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
  42.         info.addRoles(roles);
  43.         info.addStringPermissions(Permissions);
  44.         return info;
  45.     }
  46.     /***
  47.      *  认证方法
  48.      * @param authenticationToken
  49.      * @return
  50.      * @throws AuthenticationException
  51.      */
  52.     @Override
  53.     protected SimpleAuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
  54.         // 获取登录名
  55.         String username = (String) authenticationToken.getPrincipal();
  56.         SecurityService service = new SecurityServiceImpl();
  57.         Map<String,String> map = service.findPasswordByUsername(username);
  58.         if(map.isEmpty()){
  59.             throw new UnknownAccountException("账号不存在!");
  60.         }
  61.         String password = map.get("password");
  62.         String salt = map.get("salt");
  63.         return new SimpleAuthenticationInfo(username, password, ByteSource.Util.bytes(salt), getName());
  64.     }
  65. }
复制代码
service 和serviceImpl
  1. package service;
  2. import java.util.List;
  3. import java.util.Map;
  4. // 模拟数据库操作
  5. public interface SecurityService {
  6.     Map<String,String> findPasswordByUsername(String username);
  7.     // 查询角色
  8.     List<String> findRoleByLoginName(String username);
  9.     // 查询资源
  10.     List<String> findPermissionByLoginName(String username);
  11. }
复制代码
  1. package service.impl;
  2. import service.SecurityService;
  3. import tools.DigestsUtil;
  4. import java.util.ArrayList;
  5. import java.util.Collections;
  6. import java.util.List;
  7. import java.util.Map;
  8. public class SecurityServiceImpl implements SecurityService {
  9.     @Override
  10.     public Map<String,String> findPasswordByUsername(String username) {
  11.         return DigestsUtil.entryptPassword("123");
  12.     }
  13.     @Override
  14.     public List<String> findRoleByLoginName(String username) {
  15.         List<String> roles = new ArrayList<>();
  16.         roles.add("admin");
  17.         roles.add("dev");
  18.         return roles;
  19.     }
  20.     @Override
  21.     public List<String> findPermissionByLoginName(String username) {
  22.         List<String> permissions = new ArrayList<>();
  23.         permissions.add("order:add");
  24.         permissions.add("order:list");
  25.         permissions.add("order:del");
  26.         return permissions;
  27.     }
  28. }
复制代码
demo类
  1. import org.apache.shiro.SecurityUtils;
  2. import org.apache.shiro.authc.UsernamePasswordToken;
  3. import org.apache.shiro.config.IniSecurityManagerFactory;
  4. import org.apache.shiro.mgt.SecurityManager;
  5. import org.apache.shiro.subject.Subject;
  6. import org.junit.Test;
  7. public class ShiroDemo {
  8.     public Subject shiroLogin( ){
  9.         //1.导入权限ini文件,创建SecurityManagerFactory
  10.         IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
  11.         //2.获取SecurityManager,绑定到SecurityUtils中
  12.         SecurityManager securityManager =factory.getInstance();
  13.         SecurityUtils.setSecurityManager( securityManager);
  14.         //3.获取一个用户主体
  15.         Subject currentUser = SecurityUtils.getSubject();
  16.         UsernamePasswordToken token = new UsernamePasswordToken("guest", "123");
  17.         currentUser.login(token);
  18.         System.out.println("是否登录成功:"+currentUser.isAuthenticated());
  19.         return currentUser;
  20.     }
  21.     @Test
  22.     public void testPermissionRealm() {
  23.         Subject currentUser = shiroLogin();
  24.         // 校验当前用户是否有管理员角色
  25.         System.out.println("是否有管理员角色:"+currentUser.hasRole("admin"));
  26.         // 校验当前用户没有的角色
  27.         try {
  28.             currentUser.checkRole("coder");
  29.             System.out.println("当前用户有coder角色");
  30.         }catch (Exception e){
  31.             System.out.println("当前用户没有coder角色");
  32.         }
  33.         // 校验当前用户的权限信息
  34.         System.out.println("是否有查询权限:"+currentUser.isPermitted("order:list"));
  35.         // 校验当前用户没有的权限
  36.         try {
  37.             currentUser.checkPermission("order:update");
  38.             System.out.println("当前用户有修改的权限");
  39.         }catch (Exception e){
  40.             System.out.println("当前用户没有修改的权限");
  41.         }
  42.     }
  43. }
复制代码
运行结果

1.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册