博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot和shiro整合项目实战三(图解超详细)
阅读量:3897 次
发布时间:2019-05-23

本文共 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/

你可能感兴趣的文章
Event的三个阶段
查看>>
WebKit之MediaPlayer的简单分析
查看>>
WebKit之MediaPlayer之底层调度的源码分析
查看>>
WIFI之系统模块列表介绍
查看>>
C++之数据库处理代理模块
查看>>
C++之编码实现ping的功能
查看>>
C++之动态配置ip信息
查看>>
生活之工资条(薪资结构参考)
查看>>
Makefile之通用模板
查看>>
Makefile之常用函数介绍
查看>>
Makefile之自动变量介绍
查看>>
C++之位测试练习的相关代码
查看>>
C++之IPC测试单元
查看>>
C++之测试snmp的注册模块
查看>>
WebKit之WebSocket的初步源码分析2
查看>>
WebKit之Canvas的源码初步分析1
查看>>
WebKit之Canvas源码分析2
查看>>
WebKit之CSSValue的继承关系
查看>>
WebKit之ScriptWrapper继承关系图
查看>>
Perl之默认变量
查看>>