Loading

自学shiro

1.实现AuthorizingRealm接口,重写两个方法

例子1

public class AuthRealm extends AuthorizingRealm {
    @Autowired
    private UserService userService;

    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        User user = (User) principals.fromRealm(this.getClass().getName()).iterator().next();
        List<String> permissionList = new ArrayList<String>();
        List<String> roleNameList = new ArrayList<String>();
        Set<Role> roleSet = user.getRoles();
        if (CollectionUtils.isNotEmpty(roleSet)) {
            for (Role role : roleSet) {
                roleNameList.add(role.getRname());
                Set<Permission> permissionSet = role.getPermissions();
                if (CollectionUtils.isNotEmpty(permissionSet)) {
                    for (Permission permission : permissionSet) {
                        permissionList.add(permission.getName());
                    }
                }
            }
        }
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addStringPermissions(permissionList);
        info.addRoles(roleNameList);
        return info;
    }

    // 认证登陆
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;
        String username = usernamePasswordToken.getUsername();
        User user = userService.findByUsername(username);
        return new SimpleAuthenticationInfo(user, user.getPassword(), this.getClass().getName());
    }
}

例子2

public class ShiroRealm extends AuthorizingRealm {
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
	// 第一步从token中取出用户名
		String userName = (String) token.getPrincipal();
	// 第二步:根据用户输入的userName从数据库查询
	User user = userService.findByUsername("userName");		
	if(user==null){
		return null;//用户不存在
	}
	//第三步  从数据库取该用户的passw
	String password = user.getPassword();
	// 第四步  加盐
		String salt = userCode;
		.......其他判断逻辑......
		// 第五步  创建SimpleAuthenticationInfo
		SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(user,password,ByteSource.Util.bytes(salt), this.getName());
		//第六步 返回
		return simpleAuthenticationInfo;//  return的过程完成 password的验证
}

}

SimpleAuthenticationInfo

第一个参数是根据用户输入的用户名从数据库找到的用户对象
第二个参数是数据库里的密码
第三个参数是这个类的名称

1.为什么传了用户对象还要传数据库里的密码,对象里不是包含吗?

原因不清楚,猜想是万一对象里没有密码或加密。这里故意多传一个,方便后面比较
比较过程是和token里的密码比较,因为这个token随时可以拿到,所以,就没有传

posted @ 2023-04-03 22:59  风萧萧5  阅读(9)  评论(0编辑  收藏  举报