한 걸음 한 걸음 shiro - 2 설정 을 가르쳐 주 고 realm 을 사용자 정의 합 니 다.
shiro 에서 realm 은 인증 과 권한 을 수 여 받 은 구성 요소 로 몇 가지 실현 을 가 져 왔 습 니 다. 예 를 들 어 jdbc Realm 과 iniRealm 등 실제 프로젝트 에서 모두 자신 이 realm 을 실현 할 것 입 니 다.
CREATE TABLE IF NOT EXISTS `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ' ID',
`user_name` varchar(10) NOT NULL DEFAULT '' COMMENT ' ',
`password` varchar(50) NOT NULL DEFAULT '' COMMENT ' , , md5',
`roles` varchar(20) NOT NULL DEFAULT '' COMMENT ' , ',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ' ',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ' ',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_idx_role_name` (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=' ';
@Service
public class UserService {
//mybatis dao
@Resource
private UserDao userDao;
// user
public User queryUserByName(String name) {
try {
if (StringUtils.isBlank(name)) {
return null;
}
return userDao.queryUserByName(name);
} catch (Exception e) {
log.error("db error when query user:{}", name, e);
}
return null;
}
//
public Set queryUserRole(String userName) {
User user = queryUserByName(userName);
if (user == null) {
return Collections.emptySet();
}
List roleList = StringAssist.splitComma(user.getRoles());
return Sets.newHashSet(roleList);
}
}
@PostMapping("login")
public String login(String username, String password) {
try {
//shiro SecurityUtils.getSubject() , ,
Subject subject = SecurityUtils.getSubject();
// ,
if (subject.isAuthenticated()) {
return "redirect:/static/html/indexLogin.html";
}
// UsernamePasswordToken,shiro token Principal Credentials
//Principal ,Credentials
//UsernamePasswordToken username Principal,password Credentials
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//rememberMe
token.setRememberMe(true);
subject.login(token);
} catch (AuthenticationException e) {
// ,
return "redirect:/static/html/loginError.html";
}
return "redirect:/static/html/indexLogin.html";
}
public class MyRealm extends AuthorizingRealm {
@Resource
private UserService userService;
// roles permission ,
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//principals.getPrimaryPrincipal()
if (principals == null || StringUtils.isBlank((String) principals.getPrimaryPrincipal())) {
return null;
}
// SimpleAuthorizationInfo
return new SimpleAuthorizationInfo(userService.queryUserRole((String) principals.getPrimaryPrincipal()));
}
//token login UsernamePasswordToken
//getPrincipal() getUsername(),getCredentials() getPassword()
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
if (token == null||StringUtils.isBlank((String) token.getPrincipal())) {
return null;
}
// token , user
User user = userService.queryUserByName((String) token.getPrincipal());
if (user == null) {
return null;
}
//SimpleAuthenticationInfo , 、 、
// md5 , , ,
//getName() realm , realm, , realm
// , token SimpleAuthenticationInfo , Principal(), token Credentials
// md5 SimpleAuthenticationInfo , SimpleAuthenticationInfo Credentials
return new SimpleAuthenticationInfo(
user.getUserName(), user.getPassword(), ByteSource.Util.bytes(user.getUserName()), getName());
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.