目录
1.导入shiro依赖:
2.创建自定义的Realm,继承于shiro的AuthorizingRealm :
3.配置shiro:
4.编写登录控制类:
5.在页面中输入用户名和密码,并将值提交至控制类中的/login请求去执行即可
1.导入shiro依赖:
org.apache.shiro
shiro-spring-boot-web-starter
1.9.0
2.创建自定义的Realm,继承于shiro的AuthorizingRealm :
public class LoginRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) {
//转换令牌并获取用户输入的用户名
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;
String username = usernamePasswordToken.getUsername();
SimpleAuthenticationInfo info = null;
//进行登录校验
if ("admin".equals(username)) {//如果用户名为admin,则进行校验
//返回进行登录认证的AuthenticationInfo对象,交给securityManager去校验
info = new SimpleAuthenticationInfo(username, //登录用户名,登录成功后,该值会填充到subject中
"password", //登录成功需要的密码,会与用户输入的密码进行登录匹配
this.getName());//指定使用的Realm名称
} else {
//登录失败
System.out.println("用户名错误");
}
return info;
}
}
3.配置shiro:
public class LoginRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) {
//转换令牌并获取用户输入的用户名
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;
String username = usernamePasswordToken.getUsername();
SimpleAuthenticationInfo info = null;
//进行登录校验
if ("admin".equals(username)) {//如果用户名为admin,则进行校验
//返回进行登录认证的AuthenticationInfo对象,交给securityManager去校验
info = new SimpleAuthenticationInfo(username, //登录用户名,登录成功后,该值会填充到subject中
"password", //登录成功需要的密码,会与用户输入的密码进行登录匹配
this.getName());//指定使用的Realm名称
} else {
//登录失败
System.out.println("用户名错误");
}
return info;
}
}
3.配置shiro:
自定义完Realm后,创建一个shiro配置类,在其中依次创建自定义的Realm对象、安全管理器DefaultWebSecurityManager 以及过滤请求ShiroFilterFactoryBean对象,并使用@Bean注解将对象交由spring容器控制(将自定义的Realm对象添加到安全管理器中,并为ShiroFilterFactoryBean对象配置此安全管理器)
@Configuration
public class ShiroConfig {
@Bean
public Realm realm() {
LoginRealm loginRealm = new LoginRealm();
return loginRealm;
}
@Bean
public DefaultWebSecurityManager securityManager(Realm realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//为安全管理器添加自定义的Realm
securityManager.setRealm(realm);
return securityManager;
}
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
//创建ShiroFilterFactoryBean对象
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//给ShiroFilterFactoryBean对象配置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
//设置受限资源和公共资源
Map map = new HashMap<>();
map.put("/login", "anon");//对登录请求放行
map.put("
@RequestMapping("/toLogin")
public String toLogin() {
return "login";
}
@RequestMapping("/logout")
public String logout() {
Subject subject = SecurityUtils.getSubject();
subject.logout();//退出登录
return "redirect:/toLogin";
}
@RequestMapping("/toIndex")
public String toIndex() {
return "index";
}
@RequestMapping("/login")
public String login(String username, String password) {
//通过用户输入的用户名和密码创建令牌
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//创建Subject对象,进行登录认证
Subject subject = SecurityUtils.getSubject();
try {
subject.login(token);//进行登录认证
//登录成功,前往index页面
System.out.println("登录成功");
return "redirect:/toIndex";
} catch (AuthenticationException e) {
//登录失败,重定向至登录页面
System.out.println("登录失败");
return "redirect:/toLogin";
}
}
}



