2、创建数据表结构用户注册
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for t_user -- ---------------------------- DROp TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `id` int(6) NOT NULL AUTO_INCREMENT, `username` varchar(40) DEFAULT NULL, `password` varchar(40) DEFAULT NULL, `salt` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; SET FOREIGN_KEY_CHECKS = 1;3、项目引入依赖
com.baomidou
mybatis-plus-boot-starter
3.4.3.4
org.apache.shiro
shiro-spring-boot-starter
1.8.0
com.alibaba
druid
1.2.8
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
8.0.25
runtime
4、配置application.yaml配置文件
spring:
application:
# 应用名字
name: shiro
mvc:
view:
prefix: /
suffix: .html
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/shirodemo?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
server:
# 端口号
port: 8888
mybatis:
#别名
type-aliases-package: com.zhubayi.shirodb.entity
#xml的位置
mapper-locations: classpath:mapper/*Mapper.xml
5、创建entity
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.AUTO)
private String id;
private String username;
private String password;
private String salt;
}
6、创建Mapper接口
@Mapper public interface UserMapper extends baseMapper7、开发mapper配置文件{ void save(User user); }
8、开发service接口insert into t_user values(#{id},#{username},#{password},#{salt})
public interface UserService extends IService8、创建salt工具类{ void register(User user); }
public class SaltUtils {
public static String getSalt(int n){
char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890!@#$%^&*()".toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
char aChar = chars[new Random().nextInt(chars.length)];
sb.append(aChar);
}
return sb.toString();
}
}
9、开发service实现类
@Service @Transactional public class UserServiceImpl extends ServiceImpl10、开发Controllerimplements UserService { @Autowired private UserMapper userMapper; @Override public void register(User user) { //1.生产随机盐 String salt = SaltUtils.getSalt(8); //2.把随机盐保存到数据库 user.setSalt(salt); //3.明文密码进行md5 + salt + hash散列 Md5Hash md5Hash = new Md5Hash(user.getPassword(),salt,1024); user.setPassword(md5Hash.toHex()); userMapper.save(user); } }
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("register")
public String register(User user){
System.out.println(user);
try {
userService.register(user);
return "redirect:/login.html";
}catch (Exception e){
e.printStackTrace();
return "redirect:/register.html";
}
}
}
11、启动项目进行注册
//根据身份信息认证的方法
User findByUserName(@Param("username") String username);
2、开发mapper配置文件
3、开发Service接口insert into t_user values(#{id},#{username},#{password},#{salt})
public interface UserService extends IService4、开发Service实现类{ void register(User user); User findByUserName(String username); }
@Override
public User findByUserName(String username) {
return userMapper.findByUserName(username);
}
5、发在工厂中获取bean对象的工具类
@Component
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
//根据bean名字获取工厂中指定bean 对象
public static Object getBean(String beanName){
return context.getBean(beanName);
}
}
6、修改自定义realm
public class MyRealm extends AuthorizingRealm {
private UserService userService;
public MyRealm(UserService userService){
this.userService=userService;
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//获取身份信息
String username=(String) authenticationToken.getPrincipal();
//得到service
//得到用户信息
User user=userService.findByUserName(username);
if(!ObjectUtils.isEmpty(user)){
//返回数据库信息
return new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(),
ByteSource.Util.bytes(user.getSalt()),this.getName());
}
return null;
}
}
7、修改ShiroConfig中realm使用凭证匹配器以及hash散列
@Bean
public Realm getRealm(UserService userService){
MyRealm myRealm = new MyRealm(userService);
//设置hash的凭证匹配器
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
//设置md5加密
credentialsMatcher.setHashAlgorithmName("md5");
//设置散列次数
credentialsMatcher.setHashIterations(1024);
myRealm.setCredentialsMatcher(credentialsMatcher);
return myRealm;
}
8、开发controller并且测试
@PostMapping("login")
public String login(String username,String password){
//获取主体对象
Subject subject = SecurityUtils.getSubject();
try {
subject.login(new UsernamePasswordToken(username,password));
return "redirect:/index.html";
}catch (UnknownAccountException e){
e.printStackTrace();
System.out.println("用户名错误");
}catch (IncorrectCredentialsException e){
e.printStackTrace();
System.out.println("密码错误");
}
return "redirect:/login.html";
}
登录成功~
3、授权实现 1、添加依赖
org.springframework.boot
spring-boot-starter-thymeleaf
2.5.6
com.github.theborakompanioni
thymeleaf-extras-shiro
2.1.0
2、页面资源授权
首页
欢迎进入后台管理系统
退出登录



