当前位置:首页 > Java资讯 > 正文内容

Shiro:Java安全框架的“守护神”,实战解析与应用技巧

admin2个月前 (06-19)Java资讯14

Shiro:Java安全框架的“守护神”,实战解析与应用技巧

一、Shiro简介

Shiro,全称Simple Identity and Role-Based Access Control,是一个开源的安全框架,用于实现用户认证、授权、会话及加密等安全相关功能。Shiro旨在为Java应用提供一个简单、易用、强大的安全解决方案。相较于其他安全框架,Shiro具有以下特点:

1. 简单易用:Shiro采用模块化设计,易于理解和使用。

2. 强大功能:Shiro提供了丰富的安全相关功能,如用户认证、授权、会话管理、加密等。

3. 高度可扩展:Shiro提供多种扩展点,方便用户根据需求进行定制。

二、Shiro核心组件

Shiro框架主要由以下核心组件构成:

1. Subject:主体,即当前用户。

2. SecurityManager:安全管理器,负责管理Subject、Session、权限等。

3. Realm:域,用于封装用户认证和授权逻辑。

4. SessionManager:会话管理器,负责管理Subject的会话。

5. CacheManager:缓存管理器,用于缓存用户认证和授权信息。

6. Cryptography:加密器,用于加密敏感信息。

三、Shiro实战解析

以下以一个简单的示例,演示如何使用Shiro实现用户认证和授权。

1. 添加Shiro依赖

在项目的pom.xml文件中添加以下依赖:

```xml

org.apache.shiro

shiro-core

1.4.0

```

2. 配置Shiro

在项目的web.xml文件中配置Shiro过滤器:

```xml

shiroFilter

org.apache.shiro.web.filter.servlet.ShiroFilter

loginUrl

/login.jsp

unauthorizedUrl

/unauthorized.jsp

shiroFilter

/*

```

3. 编写Shiro配置类

创建一个Shiro配置类,用于配置Shiro的各个组件:

```java

import org.apache.shiro.config.IniSecurityManagerFactory;

import org.apache.shiro.mgt.SecurityManager;

import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

import org.apache.shiro.web.filter.mgt.DefaultFilterChainManager;

import org.apache.shiro.web.filter.mgt.FilterChainManager;

import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;

import org.apache.shiro.web.filter.authz.AuthorizationFilter;

import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;

import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter;

import org.apache.shiro.web.filter.authz.SslFilter;

import org.apache.shiro.web.filter.authz.UserAuthorizationFilter;

import org.apache.shiro.web.filter.session.SessionFilter;

import org.apache.shiro.web.filter.access.PathMatchingFilterChainResolver;

import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;

import org.apache.shiro.web.servlet.ShiroFilterFactoryBean;

public class ShiroConfig {

public static ShiroFilterFactoryBean createShiroFilterFactoryBean() {

ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

shiroFilterFactoryBean.setSecurityManager(createSecurityManager());

shiroFilterFactoryBean.setLoginUrl("/login.jsp");

shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized.jsp");

shiroFilterFactoryBean.setFilterChainDefinitionMap(createFilterChainDefinitionMap());

return shiroFilterFactoryBean;

}

private static SecurityManager createSecurityManager() {

DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

securityManager.setRealm(createAuthorizingRealm());

return securityManager;

}

private static AuthorizingRealm createAuthorizingRealm() {

AuthorizingRealm realm = new AuthorizingRealm();

realm.setCredentialsMatcher(new HashedCredentialsMatcher("SHA-256"));

return realm;

}

private static Map createFilterChainDefinitionMap() {

Map filterChainDefinitionMap = new HashMap<>();

filterChainDefinitionMap.put("/login.jsp", "anon");

filterChainDefinitionMap.put("/unauthorized.jsp", "anon");

filterChainDefinitionMap.put("/**", "authc");

return filterChainDefinitionMap;

}

}

```

4. 编写认证和授权逻辑

在Shiro配置类中,创建AuthorizingRealm类,并实现doGetAuthenticationInfo方法,用于处理用户认证逻辑:

```java

import org.apache.shiro.authc.AuthenticationException;

import org.apache.shiro.authc.AuthenticationInfo;

import org.apache.shiro.authc.AuthenticationToken;

import org.apache.shiro.authc.SimpleAuthenticationInfo;

import org.apache.shiro.authz.AuthorizationInfo;

import org.apache.shiro.authz.SimpleAuthorizationInfo;

import org.apache.shiro.realm.AuthorizingRealm;

public class MyAuthorizingRealm extends AuthorizingRealm {

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

String username = (String) token.getPrincipal();

String password = new String((char[]) token.getCredentials());

// 查询数据库,验证用户名和密码

if ("admin".equals(username) && "123456".equals(password)) {

return new SimpleAuthenticationInfo(username, password, getName());

} else {

throw new AuthenticationException("用户名或密码错误");

}

}

@Override

protected AuthorizationInfo doGetAuthorizationInfo(AuthorizationInfo info) {

String username = info.getPrincipal().toString();

// 查询数据库,获取用户角色和权限

Set roles = new HashSet<>();

roles.add("admin");

Set permissions = new HashSet<>();

permissions.add("user:create");

permissions.add("user:delete");

info.setRoles(roles);

info.setStringPermissions(permissions);

return info;

}

}

```

5. 使用Shiro进行认证和授权

在需要认证和授权的页面或方法上添加@RequiresAuthentication和@RequiresPermissions注解:

```java

@Controller

public class MyController {

@RequiresAuthentication

@RequiresPermissions("user:create")

@RequestMapping("/createUser")

public String createUser() {

// 创建用户逻辑

return "success";

}

}

```

四、Shiro应用技巧

1. 使用Shiro标签进行权限控制

在JSP页面中,可以使用shiro标签进行权限控制,如:

```jsp

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags/shiro" %>

创建用户

```

2. 使用Shiro缓存提高性能

Shiro提供了缓存机制,可以缓存用户认证和授权信息,提高系统性能。在Shiro配置类中,配置CacheManager:

```java

public class ShiroConfig {

// ...

private static CacheManager createCacheManager() {

CacheManager cacheManager = new CacheManager();

cacheManager.setCacheManager(new MemoryConcurrentMapCacheManager("shiroCache"));

return cacheManager;

}

// ...

}

```

3. 使用Shiro加密敏感信息

Shiro提供了加密器Cryptography,可以用于加密敏感信息,如用户密码:

```java

import org.apache.shiro.crypto.hash.Sha256Hash;

public class PasswordUtil {

public static String encryptPassword(String password) {

return new Sha256Hash(password).toHex();

}

}

```

五、总结

Shiro是一个简单、易用、强大的Java安全框架,能够帮助开发者快速实现用户认证、授权、会话及加密等安全相关功能。通过本文的实战解析,相信大家对Shiro有了更深入的了解。在实际项目中,可以根据需求灵活运用Shiro提供的各种功能,为Java应用提供强大的安全保障。

相关文章

GitHub:开源社区的璀璨明珠,Java开发者必备利器

GitHub:开源社区的璀璨明珠,Java开发者必备利器

一、引言 GitHub,一个全球最大的开源社区,它汇聚了全球优秀的开发者,共同为开源事业贡献力量。对于Java开发者来说,GitHub不仅仅是一个代码托管平台,更是一个学习、交流、分享的绝佳场所。本...

Java行业深度揭秘:Caffeine缓存机制在实战中的应用与实践

Java行业深度揭秘:Caffeine缓存机制在实战中的应用与实践

一、引言 随着互联网的飞速发展,大数据和云计算的应用日益广泛,Java作为一门历史悠久、应用广泛的编程语言,在各个行业中都扮演着重要的角色。在Java开发过程中,性能优化是每个开发者必须面对的问题。...

Java事务传播的奥秘:深入剖析分布式系统中的关键技术

Java事务传播的奥秘:深入剖析分布式系统中的关键技术

在分布式系统中,事务传播是一个至关重要的概念。它确保了在多个服务协同工作时,数据的一致性和完整性。Java作为分布式系统开发的主流语言,对事务传播的支持尤为重要。本文将深入剖析Java事务传播的奥秘...

Java守护线程:揭秘线程池中的神秘守护者

Java守护线程:揭秘线程池中的神秘守护者

一、什么是守护线程? 在Java中,守护线程(Daemon Thread)是一种特殊的线程,它区别于用户线程(User Thread)。守护线程的主要作用是辅助其他线程完成工作,当所有的用户线程结束...

Java垃圾回收更新:揭秘下一代GC技术的革新与挑战

Java垃圾回收更新:揭秘下一代GC技术的革新与挑战

在Java领域,垃圾回收(Garbage Collection,简称GC)一直是一个备受关注的话题。随着Java虚拟机(JVM)的不断发展,垃圾回收技术也在不断更新迭代。本文将深入探讨Java垃圾回...

Java编程中的SOLID原则:如何打造高质量代码

Java编程中的SOLID原则:如何打造高质量代码

在Java编程领域,SOLID原则是许多资深开发者津津乐道的话题。它是一种指导原则,旨在帮助开发者写出高质量、可维护和可扩展的代码。本文将深入分析SOLID原则中的每一个原则,并结合实际案例,为您展...