`

基于SHIRO实现用户登陆后跳转其匿名访问的URL路径

阅读更多
需求描述:

  • 用户在未登录时访问网站中某个需要登录后才能访问的URL
  • 请求被拦截跳转登陆页面
  • 登陆后跳转未登录时访问的路径


具体实现:

1.拦截器 配置文件shiro.ini

[urls]
/usr/info/** = authc2
[filters]  
authc2=com.fiter.FormAuthenticationFilter2


解释:

(1)filters指代自定义拦截器

authc2=com.fiter.FormAuthenticationFilter2,其中等号右侧为自定义拦截器代码,左侧为

指代

(2)urls指代需要进行拦截的URI

若该访问路径的URI需要有某种限制即需要被拦截器过滤下,即配制该拦截器

2.自定义拦截器

public class FormAuthenticationFilter2 extends FormAuthenticationFilter {
private static final Logger log = LoggerFactory.getLogger(FormAuthenticationFilter2.class);//定义日志输出
@Override
protected boolean onAccessDenied(ServletRequest request,		ServletResponse response) throws Exception {
if (isLoginRequest(request, response)) {
    if (isLoginSubmission(request, response)) {
     }
      return executeLogin(request, response);
     } else {
            if (log.isTraceEnabled()) {
	 log.trace("Login page view.");
	 }
	 //allow them to see the login page ;)
	 return true;
	 }
	 } else {
	 if (log.isTraceEnabled()) {
	  log.trace("Attempting to access a path which requires authentication.  Forwarding to the " + "Authentication url [" + getLoginUrl() + "]");
  }
 HttpServletRequest httpRequest = WebUtils.toHttp(request);
 // 组装URL
 StringBuilder returnUrl = new StringBuilder("http://t.com");
 returnUrl.append(httpRequest.getRequestURI());
 Enumeration enumeration = httpRequest.getParameterNames();
      if(enumeration != null) {
           	boolean first = true;
            	while(enumeration.hasMoreElements()) {
           		Object param = enumeration.nextElement();
            		if(param != null && httpRequest.getParameter(param.toString()) != null) {
            			if(first) {
            				returnUrl.append("?");
            			}
            			returnUrl.append(param).append("=").append(httpRequest.getParameter(param.toString())).append("&");
          			first = false;
            		}
            	}
            }
            String encodedReturnUrl = returnUrl.toString();
            if(encodedReturnUrl.endsWith("&")) {
            	encodedReturnUrl = encodedReturnUrl.substring(0, encodedReturnUrl.length() - 1);
	            }
            encodedReturnUrl = URLEncoder.encode(encodedReturnUrl, "UTF-8");
	            StringBuilder builder = new StringBuilder("/login/loginpage.do?returnUrl=");
	            builder.append(encodedReturnUrl);
	            setLoginUrl(builder.toString());
	            redirectToLogin(request, response);
	            return false;
	        }
	}	
}


解释:

(1)request.getHeader("Referer"))获取上次访问的URL链接

a.原理:referer是浏览器在用户提交请求当前页面中的一个链接时,将当前页面的URL放在头

域中提交给服务端的,如当前页面为a.html,它里面有一个b.html的链接,当用户要访问b.html

时浏览器就会把a.html作为referer发给服务端.

b.限制:request.getHeader("Referer")要走HTTP协议才有值,也就是说要通过<a

href="url" />标记,才能获取到值。当然通过表单提交的也可以。而通过location或是<a

href="javascript:window.location=''" />是得不到值的

c.由于此处访问时未通过HTTP协议,故通过该方式获取的结果为空

(2)拦截器组装拦截后跳转的URL

3.实现效果

匿名访问:http://localhost:8080/m2b/usr/info/getuserinfo.do

拦截跳转:http://localhost:8080/m2b/login/loginpage.do?returnUrls=http%3A%2F%2Ft.com%2Fm2b%2Fusr%2Finfo%2Fgetuserinfo.do

该跳转URL为拦截器指定

4.跳转登陆


	@Action(value = "loginpage", results = {
			@Result(name = ResultTypeConstants.REDIRECT, type = ResultTypeConstants.REDIRECT, location = "/login/index.do"),
			@Result(name = ResultTypeConstants.ISSUE_REDIRECT, type = ResultTypeConstants.REDIRECT, location = "/login/issueredirect.do"),
			@Result(name = SUCCESS, type = ResultTypeConstants.VELOCITY, location = "/login.vm") })
	@SkipValidation
	public String loginpage() {

	returnurl = request.getParameter("returnUrl");
		if(returnurl == null) {
			returnurl = request.getHeader("Referer");
		}
		logger.info("returnUrl:" + returnurl);
		request.getSession().setAttribute("returnUrl", returnurl);
		// 用户已登录
		Subject currentUser = SecurityUtils.getSubject();
		if (currentUser != null && currentUser.isAuthenticated()) {
			return ResultTypeConstants.REDIRECT;
		}

		if (currentUser != null && currentUser.isRemembered()) {
			user = (User) currentUser.getPrincipal();
			rememberme = "1";
		}
		return SUCCESS;
	}


解释:

(1)request.getParameter("returnUrl");获取拦截器组装的指定的URL中的参数,即http://t.com?returnUrl=http%3A%2F%2F%2Fm2b%2Fusr%2Finfo%2Fgetuserinfo.do

(2)request.getParameter("");的使用

a.获取URL中的参数

b.获取页面通过submit方式的传值


<form. name="form1" method="post" action="authenticate.jsp">
请输入用户姓名:<input type="text" name="username">
<input type="submit" name="Submit" value="提交">
</form>

分享到:
评论

相关推荐

    基于Shiro 拦截URL,实现权限控制

    这些拦截器可以基于URL路径或特定的HTTP方法(如GET、POST等)来决定是否允许用户访问。Shiro的Web模块提供了一个名为`FilterChainResolver`的接口,它负责构建和解析过滤链,将URL映射到对应的过滤器。 以下是使用...

    基于shiro实现的用户登录系统

    基于shiro实现的用户登录系统,运行sql文件更改数据库连接可直接运行,项目集成了mybatis-plus,shiro,springmvc,角色管理和组管理,非常简单实用,非常适合学习,不用输入验证码可以登录,admin密码123456

    shiro实现单点登录

    在IT行业中,单点登录(Single Sign-On,简称SSO)是一种身份验证机制,它允许用户在一个应用系统中登录后,无需再次认证即可访问其他相互信任的应用系统。Apache Shiro是一个强大且易用的Java安全框架,提供了认证...

    spring boot整合shiro实现url请求过滤

    本demo为Spring boot整合shiro,以mybatis plus做dao层交互数据,实现了读取数据库用户数据实现用户登录,权限认证,读取数据库中用户对应的url请求,实现请求的过滤。自定义了relam和过滤器来实现这些功能

    SpringBoot 集成 Shiro 实现动态uri权限

    SpringBoot集成Shiro实现动态URI权限是一个常见的权限管理实践,主要目的是为了实现更灵活、更安全的用户访问控制。在Web应用中,权限控制通常包括角色管理、菜单管理、操作权限(URI)管理等,而动态URI权限则允许...

    SpringBoot整合Shiro后实现免密登录

    SpringBoot整合Shiro后实现免密登录 1,说明一下步骤,需要在原来基础新增三个文件 2,新增CustomToken,重写UsernamePasswordToken免密登录调用方法和密码登录调用方法都在里面。 3,新增...

    使用Shiro实现登录成功后跳转到之前的页面

    正确配置 Shiro 的过滤器链定义,确保只有需要认证的URL会被保存,这样才能在用户登录后跳转到他们最初尝试访问的页面。在实际应用中,根据项目的具体需求,可以结合这两种方法,以提供更优质的用户体验。

    spring boot+shiro+mybatis实现不同用户登录显示不同的权限菜单

    3. **编写Service**:在业务逻辑层,实现用户登录、获取用户角色及权限、动态加载菜单等功能。登录时,通过Shiro进行认证,成功后获取用户的角色和对应的权限。 4. **创建Controller**:在控制器层,处理前端的登录...

    java shiro实现退出登陆清空缓存

    在本文中,我们将讨论如何利用 Shiro 实现用户退出登录时清空缓存。 首先,Shiro 提供了一个 `LogoutFilter` 过滤器,用于处理用户的登出请求。默认情况下,`LogoutFilter` 在用户登出时会清除会话中的所有信息,...

    基于shiro前后端分离分布式权限管理(完整后端代码)

    总之,这个基于Shiro的分布式权限管理系统结合了现代Web开发的最佳实践,利用Shiro的强大功能和Redis集群的高效缓存,实现了安全、高效的用户权限管理。在实际开发中,这样的架构可以为大型互联网应用提供稳定、可...

    shiro实现授权登陆验证

    通过以上步骤,我们可以构建一个基础的Shiro安全框架,实现用户登录验证和基于角色/权限的访问控制。随着项目复杂性的增加,可以进一步探索Shiro的其他特性,如缓存管理、Web集成、API安全等,以满足更高级的安全...

    shiro-单用户登录.zip

    Shiro 提供了丰富的API和组件,使得开发者能够快速集成到自己的应用中,实现用户的身份验证和授权。 1. **Shiro基础概念** - **认证**:也称为身份验证,是确认用户身份的过程。在Shiro中,可以通过...

    SSM+shiro登录控制

    在这个例子中,`/login`路径被配置为匿名访问,允许任何用户访问登录页面,而其他所有路径(`/**`)都需要经过身份验证(`authc`)。如果用户试图访问受保护的资源且未登录,Shiro会将请求重定向到登录页面。 此外,...

    SpringBoot+Shiro+JWT+Jedis+MybatisPlus+前后端分离+基于url通用权限管理系统

    Shiro支持基于URL的权限拦截,这意味着可以为每个URL分配特定的访问权限,只有拥有相应权限的用户才能访问。这种方式提高了权限控制的粒度,使权限管理更为精细化。 JWT(JSON Web Token)是一种轻量级的身份验证...

    SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录

    SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 ...

    对应本博客:shiro、基于url权限管理章节的源代码

    在基于URL的权限管理中,Shiro会检查用户的权限与他们尝试访问的URL是否匹配。 3. **会话管理(Session Management)**:Shiro可以协助管理用户会话,包括创建、更新、删除会话以及会话超时等。 **基于URL的权限...

    shiro动态URL权限控制

    Shiro的动态URL权限控制主要是通过`AuthorizationFilter`实现的,这个过滤器会检查当前用户是否有访问特定URL的权限。Shiro提供了`@RequiresPermissions`和`@RequiresRoles`等注解,可以用于控制器方法上,以声明...

    shiro获取登录状态和用户信息

    ### Shiro 获取登录状态与用户信息 在Java Web开发领域,Apache Shiro 是一个非常流行的权限管理框架。它提供了一套完整的认证、授权、加密和会话管理功能。本篇文章将详细介绍如何通过Shiro框架来获取用户的登录...

    shirodemo实现web登陆

    在这个"shirodemo实现web登陆"的项目中,我们将探讨如何利用 Shiro 框架在 Web 应用中实现用户登录功能,以及相关的 JSP 和 HTML 集成。 1. **Shiro 的核心概念**: - **Authentication(认证)**:验证用户身份,...

    SpringBoot + Shiro实现前后端全分离接口安全框架

    1. **配置Shiro**:在SpringBoot应用中引入Shiro依赖,然后配置Shiro Realm,实现用户认证和授权逻辑。Realm是Shiro与应用中的用户数据源交互的接口,你可以自定义 Realm 类以连接数据库或其他用户存储。 2. **编写...

Global site tag (gtag.js) - Google Analytics