Java shiro安全框架使用介绍
概述
Java Shiro框架是一个简单易用的Java安全框架,它提供了身份验证、授权、会话管理等通用安全服务,可以轻松地集成到各种应用中。本文将介绍Java Shiro框架的使用方法和示例。
安装
Maven依赖
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.7.1</version>
</dependency>
Jar包引入
下载shiro-core.jar,并添加到项目的classpath中。
基本使用
1. 配置文件
在classpath下创建一个名为shiro.ini的文件,写入如下内容:
[users]
# 用户名=密码,角色1,角色2...
admin=123456, admin_role
user=123456, user_role
[roles]
# 角色名=权限列表,多个用逗号分隔
admin_role=user:create,user:update,user:delete,user:view
user_role=user:view
#URL映射到权限
[urls]
/#/login = anon
/#/register = anon
/#/user/** = roles[user_role]
/#/admin/** = roles[admin_role]
以上是一个简单的shiro.ini配置文件,其中包含了一些用户、角色和权限的定义以及URL映射到权限的配置。
2. 身份验证
使用Shiro进行身份验证需要先创建一个Subject对象,并将用户输入的用户名和密码传递给Subject的login方法。
//获取当前用户
Subject currentUser = SecurityUtils.getSubject();
//用户输入的用户名和密码
String username = "admin";
String password = "123456";
//调用login方法进行身份验证
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
currentUser.login(token);
如果用户输入的用户名和密码与定义在shiro.ini文件中的用户信息匹配,则登录成功,否则会抛出AuthenticationException异常。
3. 授权
使用Shiro进行授权需要先创建一个Subject对象,并调用isPermitted或checkPermission方法进行权限检查。
//获取当前用户
Subject currentUser = SecurityUtils.getSubject();
//用于判断用户是否具有指定的权限
String permission = "user:create";
//判断用户是否具有指定权限
if (currentUser.isPermitted(permission)) {
//具有权限
} else {
//没有权限
}
Shiro提供了两种判断权限的方式,isPermitted和checkPermission。isPermitted方法会返回一个boolean值来表示用户是否具有指定的权限,checkPermission方法则会抛出UnauthorizedException异常来表示用户没有指定的权限。
示例
示例1:Spring Boot集成Shiro
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
factoryBean.setLoginUrl("/login");
factoryBean.setSuccessUrl("/index");
factoryBean.setUnauthorizedUrl("/403");
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/**", "authc");
factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return factoryBean;
}
@Bean
public DefaultWebSecurityManager securityManager(Realm realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realm);
return securityManager;
}
@Bean
public Realm realm() {
ShiroRealm shiroRealm = new ShiroRealm();
shiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return shiroRealm;
}
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
credentialsMatcher.setHashAlgorithmName("md5");
credentialsMatcher.setHashIterations(2);
return credentialsMatcher;
}
}
public class ShiroRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
Set<String> roleNames = userService.getRoleNamesByUsername((String) principals.getPrimaryPrincipal());
info.setRoles(roleNames);
Set<String> permissions = userService.getPermissionNamesByUsername((String) principals.getPrimaryPrincipal());
info.setStringPermissions(permissions);
return info;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
String username = usernamePasswordToken.getUsername();
String password = new String(usernamePasswordToken.getPassword());
User user = userService.getUserByUsername(username);
if (user == null) {
throw new UnknownAccountException("用户不存在");
}
if (!password.equals(user.getPassword())) {
throw new IncorrectCredentialsException("用户名或密码错误");
}
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password, getName());
return info;
}
}
@RestController
public class UserController {
@GetMapping("/user")
public String user() {
return "User Page!";
}
@GetMapping("/admin")
public String admin() {
return "Admin Page!";
}
}
以上是一个使用Spring Boot集成Shiro的示例,示例中定义了一个ShiroConfig类用于配置Shiro,另外还定义了一个ShiroRealm类用于身份验证和授权,最后在控制器中添加了两个用于测试的API。
示例2:使用Shiro进行密码加密
public class PasswordUtil {
private static final String SALT = "my_salt";
public static String encryptPassword(String password) {
String hashAlgorithmName = "MD5";
int hashIterations = 2;
SimpleHash hash = new SimpleHash(hashAlgorithmName, password, SALT, hashIterations);
return hash.toString();
}
}
以上是一个小例子,用来演示如何使用Shiro进行密码加密。示例中使用MD5算法对原始密码进行加密,加密时设置了一个Salt值和迭代次数,生成一个128位的密码串。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java shiro安全框架使用介绍 - Python技术站