本文共 4147 字,大约阅读时间需要 13 分钟。
承接上一篇博客:
下一篇博客: 首先要说的是,这个项目实战是参考自黑马,可以去对应视频看一看:接下来就是实现用户登录功能
首先是修改login.html登录页面 登录
然后修改对应的controller
package com.example.controller;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.IncorrectCredentialsException;import org.apache.shiro.authc.UnknownAccountException;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.subject.Subject;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class UserController { //测试方法 @ResponseBody @RequestMapping("/hello") public String hello(){ System.out.println("UserController.hello()"); return "ok"; } //在使用 @RequestMapping后,返回值通常解析为跳转路径, // 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body //测试thymeleaf //所以注意的是 这边是没加@ResponseBody,也就是他就是一个跳转路径,所以要创建一个test @RequestMapping("/testThymeleaf") public String testThymeleaf(Model model){ //把数据存入到model中 model.addAttribute("name","wzw"); //返回界面 return "test"; } //用户的增加 @RequestMapping("/add") public String add(){ System.out.println("UserController.add()"); //这里返回的是路径 //所以是需要删除ResponseBody return "user/add"; } //用户的更新 @RequestMapping("/update") public String update(){ System.out.println("UserController.update()"); //同理返回路径 return "user/update"; } //用户的的登录 @RequestMapping("/login") public String login(){ System.out.println("UserController.login()"); //同理返回路径 return "login"; } /** * 登录逻辑处理 */ //这里的话 我把页面就改成了loginlogin @RequestMapping("/loginlogin") //model这个参数是用来存一些可用的信息 public String loginlogin(String name,String password,Model model){ /** * 这里就开始使用shiro编写认证了 */ //1.获取subject,调用Sercurity的方法 Subject subject = SecurityUtils.getSubject(); //然后封装用户数据 UsernamePasswordToken token=new UsernamePasswordToken(name,password); //然后调用subject的登录方法,并使用try catch来分别捕获用户名和密码这两个异常 try { subject.login(token); //登录成功就直接去test界面好了 return "redirect:/testThymeleaf"; //然后修改两个不同的异常 } catch (UnknownAccountException e) { //这个是用户名不存在的异常 model.addAttribute("msg","用户名不存在"); //然后就需要返回到登录页面 return "/login"; }catch (IncorrectCredentialsException e) { //这个是密码错误的异常 model.addAttribute("msg","密码错误"); //然后就需要返回到登录页面 return "/login"; } }}
运行一下application看一下
会发现命令行这边已经进入了认证逻辑 所以在UserRelam这边修改这个认证逻辑package com.example.shiro;import org.apache.shiro.authc.*;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;/** * 自定义的Realm shiro有两个功能,认证和授权,所以刚好实现这两个功能 */public class UserRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("执行授权逻辑"); return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { System.out.println("执行认证逻辑"); //假设数据库的用户名和密码 String name="wzw"; String password="123"; //编写shiro判断逻辑,也就是判断用户名和密码 //首先是判断用户名, 也就是看和数据库的是否一致,强制转换这个,然后就可以对比了 UsernamePasswordToken token= (UsernamePasswordToken)authenticationToken; if(!token.getUsername().equals(name)){ //也就是用户名不存在,直接返回null就行,shiro的底层会抛出异常的 return null;//shiro底层 UnKnowAccountException } //判断密码的话,可以认为是shiro可以自动判断,只需要返回AuthenticationInfo的一个子类,并且返回对应的参数即可 //第一个和最后一个参数可以省略,只需要中间这个参数是密码即可 return new SimpleAuthenticationInfo("",password,""); }}这样子如果输入正确的,就会返回正确的了。
转载地址:http://xsfen.baihongyu.com/