shiro 实现接口权限
时间: 2024-06-06 08:01:08 浏览: 240
基于权限角色授权实现-shiro个人总结ppt
Shiro 是一个强大的 Java 安全框架,可以用于实现接口权限控制。下面是一些基本步骤:
1. 引入 Shiro 依赖
在项目的 pom.xml 文件中引入 Shiro 依赖,例如:
```
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.7.1</version>
</dependency>
```
2. 配置 Shiro
在项目中配置 Shiro,例如:
```
@Bean("shiroFilterFactoryBean")
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/api/v1/login", "anon");
filterChainDefinitionMap.put("/api/v1/logout", "logout");
filterChainDefinitionMap.put("/api/v1/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
@Bean("securityManager")
public SecurityManager securityManager(Realm realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realm);
return securityManager;
}
@Bean("realm")
public Realm realm() {
return new MyRealm();
}
```
上面的代码中,我们配置了 Shiro 的过滤器工厂和安全管理器,并设置了 URL 的权限控制规则。
3. 自定义 Realm
在 Shiro 中,Realm 是用于验证用户身份和获取用户权限的组件。我们需要自定义一个 Realm 类,并实现 doGetAuthenticationInfo 和 doGetAuthorizationInfo 方法。
例如:
```
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.addRole("admin");
authorizationInfo.addStringPermission("/api/v1/user/**");
return authorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
if (!"admin".equals(username)) {
throw new UnknownAccountException("用户名或密码错误!");
}
if (!"123456".equals(password)) {
throw new IncorrectCredentialsException("用户名或密码错误!");
}
return new SimpleAuthenticationInfo(username, password, getName());
}
}
```
上面的代码中,我们定义了一个 MyRealm 类,并实现了 doGetAuthenticationInfo 和 doGetAuthorizationInfo 方法,其中 doGetAuthorizationInfo 方法用于获取用户权限信息,doGetAuthenticationInfo 方法用于验证用户身份信息。
4. 在接口方法上添加 Shiro 注解
在需要进行权限控制的接口方法上添加 Shiro 的注解,例如:
```
@RequiresPermissions("/api/v1/user/list")
@GetMapping("/list")
public List<User> list() {
return userService.list();
}
```
上面的代码中,我们在 list 方法上添加了 @RequiresPermissions("/api/v1/user/list") 注解,表示只有拥有 "/api/v1/user/list" 权限的用户才能够访问该接口。
总的来说,使用 Shiro 实现接口权限控制的步骤比较简单,但需要注意的是,Shiro 只能对 URL 进行权限控制,如果需要对某些操作进行权限控制,需要自己进行代码实现。
阅读全文