1. 分析代码
- 导入依赖
- 配置文件
- HelloWorld
官网quickstart里面有示例代码,主要有如下
Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
currentUser.isAuthenticated()
currentUser.getPrincipal()
currentUser.hasRole( "schwartz" )
currentUser.isPermitted( "lightsaber:weild" )
currentUser.logout();
架构简介:https://blog.youkuaiyun.com/asdasdasd123123123/article/details/87481993
2. SpringBoot整合Shiro
- 导入shiro的整合依赖
- 编写shiro的两个核心配置
- ShiroConfig(三个Bean)
- UserRealm(授权+认证)
3. 实现登录拦截
使用thymeleaf创建首页和首页链接的两个页面,拦截两个页面
//在第一个Bean配置里面
Map<String, String> filterMap = new LinkedHashMap();
filterMap.put("/user/add","authc");
filterMap.put("/user/update","authc");
filterMap.put("/user/*","authc");//也支持通配符
//拦截后设置跳转到登录页面
shiroFilterFactoryBean.setLoginUrl("/toLogin");
bean.setFilterChainDefinitionMap(filerMap);
4. 实现用户认证
-
需要实现:在首页index点击进入add或者update页面时判断是否登录,如果没有登录就跳转到登录页面,如果成功就再进入首页,此时进入add和update页面不受限制
-
登录界面
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>shiro登录</title> </head> <body> <div> <p th:text="${msg}" style="color: #ff0000"></p> <form method="get" th:action="@{/login}"> <p>用户名:<input type="text" name="username"></p> <p>密 码:<input type="text" name="password"></p> <p><input type="submit" value="登录"></p> </form> </div> </body> </html>
-
Shiro的类在全局不受限制,可以直接写在Controller里面
//判断登录那里参照QuickStart写的 @RequestMapping("/login") public String login(String username,String password,Model model){ //获取当前输入的用户 Subject subject = SecurityUtils.getSubject(); //封装用户的数据 UsernamePasswordToken token = new UsernamePasswordToken(username,password); //登录,没有异常就说明登录成功 try { subject.login(token); return "index"; } catch (UnknownAccountException e) { model.addAttribute("msg","用户名错误"); return "login"; }catch (IncorrectCredentialsException e){ model.addAttribute("msg","密码错误"); return "login"; } }
-
认证过程在UserRealm类中写
public class UserRealm extends AuthorizingRealm { // @Autowired // private UserService userService; @Override //授权 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { System.out.println("-----授权了-----AuthorizationInfo"); return null; } @Override //认证 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.out.println("-----认证了-----AuthenticationInfo"); //这里是写死的账号密码 String name = "root"; String password = "123456"; UsernamePasswordToken userToken = (UsernamePasswordToken) token; if (!userToken.getUsername().equals(name)){ return null;//抛出异常 UnknownAccountException } // 密码认证,shiro做 return new SimpleAuthenticationInfo("",password,""); } }
5. 整合Mybatis
-
目标:根据name查询用户
-
ssm自己实现
-
UserRealm
@Override //认证 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.out.println("-----认证了-----AuthenticationInfo"); UsernamePasswordToken userToken = (UsernamePasswordToken) token; //用户名,密码去数据库取 User user = userService.queryUserByUsername(userToken.getUsername()); if (user==null){ //没有这个人 return null; //UnknownAccountException 密码会帮你处理,代码里没有明文明码 } return new SimpleAuthenticationInfo("",user.getPwd(),""); }
6. 请求授权实现
-
拦截没有特定权限的用户,ShiroConfig
-
UserRealm中直接给用户授权
-
通过数据库中的权限值赋权
7. 整合Thymeleaf
- 目的:让没有权限的链接直接不显示出来