有一个项目使用了shiro认证和授权,当该项目使用apache的VirtualHost反向代理时,出现了一个问题,
如下,是apache的配置
<VirtualHost *:80> ServerName xxx.xxx.cn ProxyPass / http://192.168.1.8:8088/projectName/ ProxyPassReverse / http://192.168.1.8:8088/projectName/ ProxyPassReverseCookiePath /projectName / </VirtualHost>
当我们输入xxx.xxx.cn 如果使我们没登录过项目,应该是跳转到登录页面也就是xxx.xxx.cn/login 的url
但是现在会自动给我们加上项目名变成了xxx.xxx.cn/projectName/login的url
原因是我们使用了shiro,shiro给我们加上了项目的名称。
解决方法
修改apache的配置加上header
<VirtualHost *:80> ServerName xxx.xxx.cn ProxyPass / http://192.168.1.8:8088/projectName/ ProxyPassReverse / http://192.168.1.8:8088/projectName/ ProxyPassReverseCookiePath /projectName / RequestHeader append myHeader "aaabbb" </VirtualHost>
然后在我们的项目中写一个filter 继承shiro的FormAuthenticationFilter,这个是认证的filter,
然后我们取出header值,如果是我们设置的,则我们就把项目名去掉
package com.qs.catering.admin.filter;
import java.io.IOException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.util.WebUtils;
public class CustomFormAuthenticationFilter extends FormAuthenticationFilter{
@Override
protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
HttpServletRequest req = (HttpServletRequest) request;
String loginUrl = getLoginUrl();
if("aaabbb".equals(req.getHeader("myHeader"))){
//此处的第5个参数,就是把项目名称去掉
WebUtils.issueRedirect(request, response, loginUrl, null, false, true);
}else{
WebUtils.issueRedirect(request, response, loginUrl);
}
}
}
同样在写一个退出filger,集成 LogoutFilter,和认证的filter同理
package com.qs.catering.admin.filter; import java.util.Locale; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.apache.shiro.session.SessionException; import org.apache.shiro.subject.Subject; import org.apache.shiro.web.filter.authc.LogoutFilter; import org.apache.shiro.web.util.WebUtils; public class CustomLogoutFilter extends LogoutFilter { private static Logger log = Logger.getLogger(CustomLogoutFilter.class); @Override protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { Subject subject = getSubject(request, response); // Check if POST only logout is enabled if (isPostOnlyLogout()) { // check if the current request's method is a POST, if not redirect if (!WebUtils.toHttp(request).getMethod().toUpperCase(Locale.ENGLISH).equals("POST")) { return onLogoutRequestNotAPost(request, response); } } String redirectUrl = getRedirectUrl(request, response, subject); //try/catch added for SHIRO-298: try { subject.logout(); } catch (SessionException ise) { log.debug("Encountered session exception during logout. This can generally safely be ignored.", ise); } HttpServletRequest req = (HttpServletRequest) request; if("aaabbb".equals(req.getHeader("myHeader"))){ WebUtils.issueRedirect(request, response, redirectUrl, null, false, true); }else{ issueRedirect(request, response, redirectUrl); } return false; } }
我们的shirioconfig 中加入下代码
Map<String, Filter> filters = shiroFilterFactoryBean.getFilters(); // 将自定义的FormAuthenticationFilter注入shiroFilter中 filters.put("authc", new CustomFormAuthenticationFilter()); // 将自定义的LogoutFilter注入shiroFilter中 filters.put("logout", new CustomLogoutFilter());
就是下图中
这样就解决了我们的问题
相关推荐
- **RememberMe**:允许用户在下次访问时自动登录。 - **Web支持**:Shiro可以方便地与Servlet容器集成,提供过滤器实现Web安全控制。 - **Caching**:支持缓存机制,减少对数据源的频繁访问,提高性能。 - **...
### Apache Shiro 使用手册(一)Shiro架构介绍 #### 一、Shiro简介 Apache Shiro 是一款功能强大且易于使用的 Java 安全框架,它提供了多种安全相关的功能和服务,包括但不限于认证、授权、加密和会话管理。相较...
权限管理Shiro系统-Apache开源顶级项目shiro-SpringMVC_Shiro项目
Apache Shiro。 官网 Apache Shiro API。 Apache Shiro开发文档。
总之,Apache Shiro 1.13.0 源码提供了深入了解 Java 安全框架的机会,无论是对于学习安全基础知识,还是解决实际项目中的安全问题,都是非常宝贵的资源。通过深入阅读和实践,开发者可以提升自身的安全编程能力,为...
### Apache Shiro 使用手册知识点详解 #### 一、Apache Shiro 概述 **1.1 什么是 Apache Shiro** Apache Shiro 是一款强大的 Java 安全框架,它集成了认证、授权、加密和会话管理等功能。这些功能使得 Shiro 成为...
总的来说,Apache Shiro 是一个全面且易于上手的 Java 安全框架,适用于各种类型的项目。通过理解它的核心概念和组件,开发者可以快速搭建起一个健壮的安全体系,确保应用程序的数据安全和访问控制。
Apache Shiro 是一个轻量级的 Java 安全框架,主要负责处理认证、授权、加密和会话管理等核心安全任务。它的设计简洁且易于使用,使得开发人员能够快速集成安全功能到各种类型的应用程序中。 Shiro 的核心组件包括 ...
"shiro使用的jar包"指的是在Java项目中集成Shiro所需的库文件。 在描述中提到的"java项目使用shiro开发所使用的jar包都在里面",这暗示了压缩包可能包含了Shiro框架的所有必需组件。通常,这些jar包包括: 1. **...
Apache Shiro 的首要目标是易于使用和理解。安全有时候是很复杂的,甚至是痛苦的,但它没有必要这样。框架应 该尽可能掩盖复杂的地方,露出一个干净而直观的 API,来简化开发人员在使他们的应用程序安全上的努力。 ...
在使用Shiro时,你需要有一个基础的Java环境(Java 1.5及以上版本),并且虽然Shiro推荐使用Apache Maven作为构建工具,但构建方式可以灵活选择,例如使用Apache Ant和Ivy也是可行的。 为了快速入门,可以参考...
shiro, Apache镜像 Apache是一个强大的。的Java安全框架,它执行认证。授权。加密和会话管理。 借助 shiro,你可以快速轻松地将任何应用程序从小型移动应用程序secure到大型网络和企业应用程序。文档和示例http://sh
Shiro 是一个 Apache Incubator 项目,旨在简化身份验证和授权。在本文中,了解 Apache Shiro 并通过示例来在一个 Groovy web 应用程序中尝试使用 Shiro 进行身份验证和授权
Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、加密和会话管理功能,简化了处理安全性的工作。在本文中,我们将深入探讨 Apache Shiro 的核心概念及其最简单的整合方式。 一、Shiro 的核心...
Apache Shiro 是一个强大且易用的Java安全框架,它提供了认证、授权、加密和会话管理功能,简化了企业级应用的安全实现。本实例将深入探讨 Apache Shiro 的核心概念和常见用法。 1. **认证**:Shiro 提供了用户身份...
Apache Shiro 使用手册 Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理等功能。Shiro 的架构主要包括三个核心组件:Subject、SecurityManager 和 Realm。 1. 认证...
当用户尝试访问受保护资源时,Shiro会自动触发认证过程。 **4. 授权(Authorization)** Shiro的授权机制允许你定义角色(Role)和权限(Permission)。在 Realm 的 `doGetAuthorizationInfo` 方法中,你需要根据...
在本文中,我们将深入探讨Apache Shiro的核心概念、主要功能以及如何在实际项目中进行使用。 1. **核心概念** - **认证**:验证用户身份的过程,即确认用户是谁。Shiro 提供了 UsernamePasswordToken 等认证令牌类...
- **环境准备**:需要Java 1.5及以上版本,推荐使用Apache Maven作为构建工具,但也可以手动集成Shiro的JAR包。 - **示例项目**:提供了两种获取示例项目的方式: - **版本控制库**:...