springboot shiro 权限控制
时间: 2023-07-18 22:07:46 浏览: 107
Spring Boot和Shiro的结合可以实现简单而又灵活的权限控制。下面是一个简单的例子:
1. 添加Shiro依赖
在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
```
2. 配置Shiro
在application.properties文件中配置Shiro:
```properties
# Shiro配置
shiro:
loginUrl: /login
successUrl: /index
unauthorizedUrl: /unauthorized
filterChainDefinitions: /index = authc
```
其中,loginUrl表示登录页面的URL,successUrl表示登录成功后跳转的URL,unauthorizedUrl表示未授权时跳转的URL,filterChainDefinitions表示URL过滤规则,这里表示访问/index需要认证(即登录)。
3. 定义用户实体类和角色实体类
定义一个用户实体类和一个角色实体类,可以使用JPA或MyBatis等框架进行持久化。
4. 自定义Realm
自定义Realm是实现Shiro权限控制的关键。可以继承AuthorizingRealm类,重写doGetAuthorizationInfo和doGetAuthenticationInfo方法。
doGetAuthenticationInfo方法用于身份认证,即验证用户名和密码是否正确。doGetAuthorizationInfo方法用于权限认证,即获取用户的角色和权限信息。
以下是自定义Realm的示例代码:
```java
public class MyRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) principals.getPrimaryPrincipal();
User user = userService.findByUsername(username);
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.setRoles(user.getRoles());
authorizationInfo.setStringPermissions(user.getPermissions());
return authorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
String username = upToken.getUsername();
User user = userService.findByUsername(username);
if (user == null) {
throw new UnknownAccountException("用户名不存在");
}
String password = new String(upToken.getPassword());
if (!user.getPassword().equals(password)) {
throw new IncorrectCredentialsException("密码错误");
}
return new SimpleAuthenticationInfo(username, password, getName());
}
}
```
5. 定义登录和登出接口
在Controller中定义登录和登出接口:
```java
@RestController
public class LoginController {
@PostMapping("/login")
public String login(String username, String password) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
return "登录成功";
} catch (UnknownAccountException e) {
return "用户名不存在";
} catch (IncorrectCredentialsException e) {
return "密码错误";
}
}
@GetMapping("/logout")
public String logout() {
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "退出成功";
}
}
```
6. 添加注解
在Controller中添加注解,控制方法的访问权限:
```java
@RestController
public class IndexController {
@GetMapping("/index")
@RequiresAuthentication
public String index() {
return "欢迎访问首页";
}
@GetMapping("/admin")
@RequiresRoles("admin")
public String admin() {
return "欢迎访问管理员页面";
}
@GetMapping("/user")
@RequiresPermissions("user:view")
public String user() {
return "欢迎访问用户页面";
}
}
```
其中,@RequiresAuthentication表示需要登录后才能访问,@RequiresRoles表示需要拥有指定角色才能访问,@RequiresPermissions表示需要拥有指定权限才能访问。
以上就是Spring Boot和Shiro实现权限控制的简单示例。
阅读全文