帮我写一个springboot 整合shiro实现登录功能
时间: 2023-04-11 14:01:36 浏览: 103
好的,我可以回答这个问题。首先,你需要在pom.xml文件中添加shiro和spring-boot-starter-thymeleaf的依赖。然后,你需要创建一个ShiroConfig类来配置Shiro的安全策略和过滤器链。接着,你需要创建一个UserController类来处理用户登录请求,并在其中使用Shiro的Subject对象进行身份验证。最后,你需要创建一个login.html页面来显示登录表单,并在其中使用Thymeleaf模板引擎来渲染页面。
相关问题
springboot整合shiro实现登录
要实现springboot整合shiro实现登录,你需要按照以下步骤进行操作:
1. 引入相关依赖:在项目的pom.xml文件中添加spring-boot-starter-web和spring-boot-starter-thymeleaf依赖。
2. 创建ShiroConfig类:在项目的配置包中创建一个名为ShiroConfig的Java类,并在该类中进行相关的配置,包括:
- 创建Realm对象并设置认证和授权方法
- 创建SecurityManager对象并设置Realm
- 创建ShiroFilterFactoryBean对象并设置SecurityManager和过滤规则
- 配置Shiro的登录页面和登录成功后的跳转页面等
3. 创建自定义Realm类:在项目中创建一个自定义的Realm类,并继承org.apache.shiro.realm.AuthenticatingRealm类。在该类中实现认证和授权的方法。
4. 创建登录页面和相关的Controller:创建一个登录页面,并在项目中创建一个Controller类,负责处理登录请求和跳转页面的逻辑。
5. 配置拦截规则:在ShiroConfig类中配置拦截规则,包括哪些URL需要进行拦截,哪些URL不需要拦截等。
6. 启动项目:运行SpringbootShiroApplication的main方法,启动项目。
7. 访问登录页面:在浏览器中输入项目的URL,访问登录页面。
8. 输入用户名和密码:在登录页面输入正确的用户名和密码,点击登录按钮。
9. 登录成功:如果用户名和密码匹配成功,则跳转到登录成功页面;否则,返回登录页面并显示错误信息。
讲一讲SpringBoot整合shiro框架实现登录认证的流程及原理
SpringBoot整合shiro框架实现登录认证的流程及原理可以分为以下步骤:
1. 引入shiro和web依赖
在pom.xml中引入shiro和web依赖,如下所示:
```xml
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
```
2. 配置shiro
在application.properties文件中配置shiro相关属性,如下所示:
```properties
# shiro配置
# 加密算法
shiro.hashAlgorithmName=md5
# 加密次数
shiro.hashIterations=2
# shiro缓存
shiro.cacheManager=org.apache.shiro.cache.MemoryConstrainedCacheManager
```
3. 自定义Realm
实现自定义Realm,继承org.apache.shiro.realm.AuthorizingRealm类,重写doGetAuthorizationInfo和doGetAuthenticationInfo方法,分别用于授权和认证。
```java
public class CustomRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
/**
* 授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
/**
* 认证
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
String username = usernamePasswordToken.getUsername();
User user = userService.findByUsername(username);
if (user == null) {
throw new UnknownAccountException("用户名不存在");
}
String password = new String(usernamePasswordToken.getPassword());
String salt = user.getSalt();
String hashedPassword = new SimpleHash("md5", password, salt, 2).toString();
if (!user.getPassword().equals(hashedPassword)) {
throw new IncorrectCredentialsException("密码错误");
}
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(), getName());
return authenticationInfo;
}
}
```
4. 配置shiroFilterFactoryBean
在配置类中配置shiroFilterFactoryBean,用于拦截请求,并进行认证和授权。
```java
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
filterFactoryBean.setSecurityManager(securityManager);
filterFactoryBean.setLoginUrl("/login");
filterFactoryBean.setUnauthorizedUrl("/unauthorized");
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/**", "authc");
filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return filterFactoryBean;
}
```
5. 配置securityManager
在配置类中配置securityManager,将自定义Realm添加到securityManager中。
```java
@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(customRealm());
return securityManager;
}
```
6. 配置shiro的注解支持
在配置类中配置shiro的注解支持,用于在Controller中使用@RequiresRoles和@RequiresPermissions注解。
```java
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
```
7. 编写Controller
编写Controller,用于处理登录请求。
```java
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String doLogin(String username, String password) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
return "redirect:/index";
} catch (UnknownAccountException e) {
return "login";
} catch (IncorrectCredentialsException e) {
return "login";
}
}
@GetMapping("/logout")
public String logout() {
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "redirect:/login";
}
@GetMapping("/unauthorized")
public String unauthorized() {
return "unauthorized";
}
}
```
以上就是SpringBoot整合shiro框架实现登录认证的流程及原理。