package com.ots.framework.shiro.realm;
|
import com.ots.common.exception.user.*;
|
import com.ots.common.utils.security.ShiroUtils;
|
import com.ots.framework.shiro.service.LoginService;
|
import com.ots.project.system.menu.service.IMenuService;
|
import com.ots.project.system.role.service.IRoleService;
|
import com.ots.project.system.user.domain.User;
|
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.authc.*;
|
import org.apache.shiro.authz.AuthorizationInfo;
|
import org.apache.shiro.authz.SimpleAuthorizationInfo;
|
import org.apache.shiro.realm.AuthorizingRealm;
|
import org.apache.shiro.subject.PrincipalCollection;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import java.util.Set;
|
|
public class UserRealm extends AuthorizingRealm {
|
private static final Logger log = LoggerFactory.getLogger(UserRealm.class);
|
@Autowired
|
private IMenuService menuService;
|
@Autowired
|
private IRoleService roleService;
|
@Autowired
|
private LoginService loginService;
|
|
@Override
|
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
|
User user = ShiroUtils.getSysUser();
|
|
Set<String> roles;
|
|
Set<String> menus;
|
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
|
|
if (user.isAdmin()) {
|
info.addRole("admin");
|
info.addStringPermission("*:*:*");
|
} else {
|
roles = roleService.selectRoleKeys(user.getUserId());
|
menus = menuService.selectPermsByUserId(user.getUserId());
|
|
info.setRoles(roles);
|
|
info.setStringPermissions(menus);
|
}
|
return info;
|
}
|
|
@Override
|
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
|
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
|
String username = upToken.getUsername();
|
String password = "";
|
if (upToken.getPassword() != null) {
|
password = new String(upToken.getPassword());
|
}
|
User user;
|
try {
|
user = loginService.login(username, password);
|
} catch (CaptchaException e) {
|
throw new AuthenticationException(e.getMessage(), e);
|
} catch (UserNotExistsException e) {
|
throw new UnknownAccountException(e.getMessage(), e);
|
} catch (UserPasswordNotMatchException e) {
|
throw new IncorrectCredentialsException(e.getMessage(), e);
|
} catch (UserPasswordRetryLimitExceedException e) {
|
throw new ExcessiveAttemptsException(e.getMessage(), e);
|
} catch (UserBlockedException e) {
|
throw new LockedAccountException(e.getMessage(), e);
|
} catch (RoleBlockedException e) {
|
throw new LockedAccountException(e.getMessage(), e);
|
} catch (Exception e) {
|
log.info("对用户[" + username + "]进行登录验证..验证未通过{}", e.getMessage());
|
throw new AuthenticationException(e.getMessage(), e);
|
}
|
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName());
|
return info;
|
}
|
|
public void clearCachedAuthorizationInfo() {
|
this.clearCachedAuthorizationInfo(SecurityUtils.getSubject().getPrincipals());
|
}
|
}
|