本文共 4717 字,大约阅读时间需要 15 分钟。
承接上一篇博客:
首先要说的是,这个项目实战是参考自黑马,可以去对应视频看一看:首先在pom里导入对应的依赖
com.alibaba druid 1.0.9 mysql mysql-connector-java org.mybatis.spring.boot mybatis-spring-boot-starter 1.1.1
我选择用Navicat来做对应数据库操作
首先是创建数据库,我给的数据库名字是test_shiro 并创建对应的用户表CREATE TABLE USER( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), PASSWORD VARCHAR(20));顺便也是插入一条记录来方便测试
然后就是配置application,properties,创建在src/main/resources.但是如果你使用的是idea的话,是会在创建项目的时候自带创建一个这个的。
spring.datasource.driverClassName=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/test_shiro?serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=admin# 连接池配置spring.datasource.type=com.alibaba.druid.pool.DruidDataSource# mybatis 别名扫描mybatis.type-aliases-package=com.example.domain
这里的用户名和密码,以及数据库名都需要做对应的修改
对于数据库的连接,也可以用idea测试一下 然后创建对应的包 创建User类package com.example.domain;public class User { private Integer id; private String name; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
再创建UserMapper接口
package com.example.mapper;import com.example.domain.User;public interface UserMapper { //这里只有一个方法 public User findByName(String name);}
再是,创建一个xml来对这个接口进行实现,这边和视频不一样的在于,看了下面的评论区:
所以第一步是 对application,properties进行修改加入mybatis.mapper-locations=classpath*:mapping/*.xml
再创建对应的文件夹
和xml文件再创建业务包
创建UserService接口和实现 UserServicepackage com.example.service;import com.example.domain.User;public interface UserService { //也是对应的方法 public User findByName(String name);}
UserServiceImpl
package com.example.serviceImpl;import com.example.domain.User;import com.example.mapper.UserMapper;import com.example.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;//这个用来实现这个方法@Servicepublic class UserServiceImpl implements UserService { //实现这个方法的途径 其实就是调用mapper接口 //注入mapper 而且是用自动注入的方法 @Autowired private UserMapper userMapper; @Override public User findByName(String name) { //就是直接调用userMapper return userMapper.findByName(name); }}
但这边userMapper会提示这个错误
所以需要修改启动类application加入@MapperScan("com.example.mapper")
最后修改UserReal实现真正的数据库连接
package com.example.shiro;import com.example.domain.User;import com.example.service.UserService;import org.apache.shiro.authc.*;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.springframework.beans.factory.annotation.Autowired;/** * 自定义的Realm shiro有两个功能,认证和授权,所以刚好实现这两个功能 */public class UserRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("执行授权逻辑"); return null; } @Autowired private UserService userService; @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { System.out.println("执行认证逻辑"); /*//假设数据库的用户名和密码 String name="wzw"; String password="123";*/ //这里就用真的连接了数据库的 //编写shiro判断逻辑,也就是判断用户名和密码 //首先是判断用户名, 也就是看和数据库的是否一致,强制转换这个,然后就可以对比了 UsernamePasswordToken token= (UsernamePasswordToken)authenticationToken; //这里用来查询用户名 User user=userService.findByName(token.getUsername()); /* if(!token.getUsername().equals(name)){ //也就是用户名不存在,直接返回null就行,shiro的底层会抛出异常的 return null;//shiro底层 UnKnowAccountException }*/ if(user==null){ //也就是用户名不存在,直接返回null就行,shiro的底层会抛出异常的 return null;//shiro底层 UnKnowAccountException } //判断密码的话,可以认为是shiro可以自动判断,只需要返回AuthenticationInfo的一个子类,并且返回对应的参数即可 //第一个和最后一个参数可以省略,只需要中间这个参数是密码即可 // return new SimpleAuthenticationInfo("",password,""); //这里是新的 return new SimpleAuthenticationInfo("",user.getPassword(),""); }}
然后启动一下,测试一下
输入一个错误的用户名 这里报错了,所以要再application.properties进行修改com.mysql.cj.jdbc.Driver(你们不一定会遇到这个错误) 再输入一个错误的账号密码 而输入正确的,即可!!!转载地址:http://lsfen.baihongyu.com/