Shiro系列之Shiro+Spring MVC整合(Integration)

Shiro系列之Shiro+Spring MVC整合

第一步,Shiro Filter

在web.xml文件中增加以下代码,确保Web项目中需要权限管理的URL都可以被Shiro拦截过滤。


    
        shiroFilter
        org.springframework.web.filter.DelegatingFilterProxy
        
            targetFilterLifecycle
            true
        
    
    
        shiroFilter
        /*
    

通常将这段代码中的filter-mapping放在所有filter-mapping之前,以达到shiro是第一个对web请求进行拦截过滤之目的。这里的fileter-name应该要和第二步中配置的java bean的id一致。

 

第二步,配置各种Java Bean

在root-context.xml文件中配置Shiro




	

	
	
		
		
		
		
	

	

	
	

	
	

	
	
        
		
		
		
		
		
	

	
	
		
		
	

	
	
		
		
		
		
		
		
		
		
		
			
				/security/*=anon
				/tag=authc
			
		
	

	
	

上述代码中已经对每个java bean的用途做了详细的注释说明,这里仅对FilterChain过滤链的定义详细阐述一下:

  • 测试用例中对/security/*的访问是不需要认证控制的,这主要是用于用户登录和退出的
  • 测试用例中对/tag的访问是需要认证控制的,就是说只有通过认证的用户才可以访问该资源。如果用户直接在地址栏中访问http://localhost:8880/learning/tag,系统会自动跳转至登录页面,要求用户先进行身份认证。

完成这两步之后,我们可以Run一下程序,如果可以看到以下页面,就表明我们的配置文件没有错误,Shiro和Spring MVC的整合已经完成了。后继的步骤可以视为是对整合后的框进行的一个测试。


Shiro系列之Shiro+Spring MVC整合(Integration)_第1张图片

第三步,编写登录页面和后台代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>





Login Page


	

login page

<%--用于输入后台返回的验证错误信息 --%>


Shiro系列之Shiro+Spring MVC整合(Integration)_第2张图片
 

后台登录代码

	/**
	 * 实际的登录代码
	 * 如果登录成功,跳转至首页;登录失败,则将失败信息反馈对用户
	 * 
	 * @param request
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/dologin")
	public String doLogin(HttpServletRequest request, Model model) {
		String msg = "";
		String userName = request.getParameter("userName");
		String password = request.getParameter("password");
		System.out.println(userName);
		System.out.println(password);
		UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
		token.setRememberMe(true);
		Subject subject = SecurityUtils.getSubject();
		try {
			subject.login(token);
			if (subject.isAuthenticated()) {
				return "redirect:/";
			} else {
				return "login";
			}
		} catch (IncorrectCredentialsException e) {
			msg = "登录密码错误. Password for account " + token.getPrincipal() + " was incorrect.";
			model.addAttribute("message", msg);
			System.out.println(msg);
		} catch (ExcessiveAttemptsException e) {
			msg = "登录失败次数过多";
			model.addAttribute("message", msg);
			System.out.println(msg);
		} catch (LockedAccountException e) {
			msg = "帐号已被锁定. The account for username " + token.getPrincipal() + " was locked.";
			model.addAttribute("message", msg);
			System.out.println(msg);
		} catch (DisabledAccountException e) {
			msg = "帐号已被禁用. The account for username " + token.getPrincipal() + " was disabled.";
			model.addAttribute("message", msg);
			System.out.println(msg);
		} catch (ExpiredCredentialsException e) {
			msg = "帐号已过期. the account for username " + token.getPrincipal() + "  was expired.";
			model.addAttribute("message", msg);
			System.out.println(msg);
		} catch (UnknownAccountException e) {
			msg = "帐号不存在. There is no user with username of " + token.getPrincipal();
			model.addAttribute("message", msg);
			System.out.println(msg);
		} catch (UnauthorizedException e) {
			msg = "您没有得到相应的授权!" + e.getMessage();
			model.addAttribute("message", msg);
			System.out.println(msg);
		}
		return "login";
	}

如果输入不存在的用户名或是错误的密码界面上会有相应的提示信息。
Shiro系列之Shiro+Spring MVC整合(Integration)_第3张图片

 


Shiro系列之Shiro+Spring MVC整合(Integration)_第4张图片
 登录成功后,会转至首页,并显示出当前用户名。


Shiro系列之Shiro+Spring MVC整合(Integration)_第5张图片
 

你可能感兴趣的:(JAVA,Shiro)