自学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随时可以拿到,所以,就没有传