目录
1.Shiro实现用户认证2.Shiro实现用户注销
1.Shiro实现用户认证
shiro中用户的认证需要放在realm中,即请求都在config中进行过滤,但是真正的权限操作需要在realm中进行,它会将config类和realm类联动起来但是前端参数的获取需要我们在controller中进行,所以我们需要在controller中写一个获取前端参数,调用shiro进行用户认证,并返回结果视图的方法
@RequestMapping("/login")
public String
toLogin(String username
, String password
, Model model
){
Subject subject
= SecurityUtils
.getSubject();
UsernamePasswordToken token
= new UsernamePasswordToken(username
, password
);
try{
subject
.login(token
);
return "index";
} catch (UnknownAccountException uae
) {
model
.addAttribute("msg","你输入的账户名或密码错误");
return "login";
} catch (IncorrectCredentialsException ice
) {
model
.addAttribute("msg","你输入的账户名或密码错误");
return "login";
} catch (LockedAccountException lae
) {
model
.addAttribute("msg","密码错误超过5次,你的账号已被冻结");
return "login";
}
}
注意:当账号/密码错误的时候,我没有返回具体是账号错误还是密码错误,这是为了提高安全性而账号+密码判断需要去realm中的认证方法中进行
@Override
protected AuthenticationInfo
doGetAuthenticationInfo(AuthenticationToken token
) throws AuthenticationException
{
System
.out
.println("执行了认证========>doGetAuthenticationInfo");
String username
= "root";
String password
= "123";
UsernamePasswordToken usernamePasswordToken
= (UsernamePasswordToken
) token
;
if (!username
.equals(usernamePasswordToken
.getUsername())){
return null
;
}
return new SimpleAuthenticationInfo("",password
,"");
}
测试 测试成功!
2.Shiro实现用户注销
按照shiro的过滤器使用语法,注销功能只需要我们在map集合中加入一个kv键值对即可,但是我们要为对应的注销写一个a标签来发起注销请求,并将a标签的href属性设置为需要注销过滤器处理的url在controller中编写一个logout处理映射方法
@RequestMapping("/logout")
public String
logout(){
return "redirect:/toLogin";
}
在config中添加注销过滤器到map集合中filterMap
.put("/logout","logout");
只要请求"/logout",就会触发shiro的注销过滤器logout前端增加a标签发起注销请求
<a th:href="@{/logout}">logout
</a>
测试 测试成功!