2024.5.21 Tuesday
接上文【WEEK13】 【DAY1】Shiro第一部分【中文版】
目录
15.3.SpringBoot整合
15.3.1.新建shiro-springboot模块
(位于springboot-08-shiro下)
按照惯例修改settings中的maven,jdk和Java版本,Project Structure中的jdk和Java版本。修改pom中的springframework版本到2.7.13(这里一定要记得修改,否则怎么重启都会显示:“类文件具有错误的版本 61.0, 应为 52.0”,本质上不是jdk版本不同导致的,是spring-boot-starter-parent的版本不适配),删除无关文件
15.3.2.新建index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>首页</h1>
<p th:text="${msg}"></p>
</body>
</html>
15.3.3.新建controller文件夹
新建MyController.java
package com.P40.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
@RequestMapping({"/", "/index"})
public String toIndex(Model model){
model.addAttribute("msg","hello, Shiro");
return "index";
}
}
15.3.4.测试连接
运行ShiroSpringbootApplication.java
访问:http://localhost:8080/
15.3.5.修改pom.xml
添加依赖:Shiro-spring,不能使用当前最新版2.0.0,会报错
Maven Repository: org.apache.shiro » shiro-spring (mvnrepository.com)
<!--shiro整合spring的包-->
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.1</version>
</dependency>
15.3.6.新建config文件夹
15.3.6.1.新建ShiroConfig.java
package com.P40.config;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ShiroConfig {
//ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//要配置什么:点击进入ShiroFilterFactoryBean源码查看
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
return bean;
}
//DefaultWebSecurityManager
@Bean(name = "securityManager") //给这个类起别名,便于ShiroFilterFactoryBean调用
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){ //获取UserRealm,但是这里好像不需要使用注解,可以直接调用
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//默认的DefaultWebSecurityManager类的类名是defaultWebSecurityManager,只是在这里修改成securityManager
//关联UserRealm
securityManager.setRealm(userRealm);
return securityManager;
}
//创建realm对象,需要自定义类
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
//创建时顺序是相反的(从real->DefaultWebSecurityManager->ShiroFilterFactoryBean)
}
15.3.6.2.新建UserRealm.java
package com.P40.config;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
//UserRealm是一个bean
//自定义的UserRealm,必须要继承AuthorizingRealm方法,然后implement methods(alt+insert)
public class UserRealm extends AuthorizingRealm {
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("do doGetAuthorizationInfo 授权");
return null;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("do doGetAuthorizationInfo 认证");
return null;
}
}
15.3.7.新建user文件夹
15.3.7.1.新建add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>add</h1>
</body>
</html>
15.3.7.2.新建update.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>update</h1>
</body>
</html>
15.3.8.修改MyController.java
添加跳转到add和update页面的控制器方法
package com.P40.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
@RequestMapping({"/", "/index"})
public String toIndex(Model model){
model.addAttribute("msg","hello, Shiro");
return "index";
}
@RequestMapping("/user/add")
public String add(){
return "user/add";
}
@RequestMapping("/user/update")
public String update(){
return "user/update";
}
}
15.3.9.修改index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>首页</h1>
<p th:text="${msg}"></p>
<hr> <!--在 HTML 页面中创建一条水平线-->
<a th:href="@{/user/add}">add</a> | <a th:href="@{/user/update}">update</a>
<!--a标签定义超链接,用于从一个页面链接到另一个页面-->
</body>
</html>
15.3.10.重启