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

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

admin2周前 (06-19)Java资讯5

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应用提供强大的安全保障。

相关文章

Java数据库优化之“覆盖索引”深度解析与实践

Java数据库优化之“覆盖索引”深度解析与实践

一、引言 在Java开发中,数据库是不可或缺的组成部分。随着业务的不断扩展,数据库的数据量和查询量也在不断增长。为了提高数据库的查询效率,我们需要对数据库进行优化。其中,索引优化是数据库优化的重要手...

《JavaScript:从入门到精通,我的编程之路》

《JavaScript:从入门到精通,我的编程之路》

自从接触到编程,我就深深被它的魅力所吸引。而在众多编程语言中,JavaScript无疑是我最热爱的一种。今天,我想和大家分享一下我的JavaScript学习之路,从入门到精通,希望对正在学习Java...

Java性能监控与调优:深入剖析JFR实践与应用

Java性能监控与调优:深入剖析JFR实践与应用

在Java领域,性能监控与调优一直是开发者和运维人员关注的焦点。其中,Java Flight Recorder(简称JFR)是Oracle官方推出的一款性能监控工具,它可以帮助我们深入分析Java程...

API文档:如何让开发者体验从入门到精通的便捷之旅

API文档:如何让开发者体验从入门到精通的便捷之旅

随着互联网技术的飞速发展,API(应用程序编程接口)已成为现代软件开发的核心组成部分。无论是搭建Web应用、移动应用还是服务端程序,API都扮演着至关重要的角色。而作为API使用者和开发者,一个详尽...

Redis:揭秘Java后端性能加速的秘密武器

Redis:揭秘Java后端性能加速的秘密武器

在Java后端开发领域,性能优化一直是开发者们关注的焦点。随着互联网应用的日益复杂,如何提高系统的响应速度和并发处理能力成为了摆在每一位开发者面前的一道难题。而Redis,作为一款高性能的内存数据结...

Java Queue:深入剖析其在多线程环境下的应用与优化

Java Queue:深入剖析其在多线程环境下的应用与优化

在Java编程中,Queue(队列)是一种常用的数据结构,它遵循先进先出(FIFO)的原则。在多线程环境下,Queue扮演着至关重要的角色,它可以有效地管理线程间的同步与通信。本文将深入剖析Java...