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

来源:转载

Shiro系列之Shiro+Spring MVC整合
第一步,Shiro Filter

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


[xml]view plaincopy




shiroFilter
org.springframework.web.filter.DelegatingFilterProxy

targetFilterLifecycle
true



shiroFilter
/*

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

第二步,配置各种Java Bean

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


[xml]view plaincopy


<?xmlversion="1.0"encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
>











value="SELECTpasswordFROMsec_userWHEREuser_name=?">
value="SELECTrole_namefromsec_user_roleleftjoinsec_roleusing(role_id)leftjoinsec_userusing(user_id)WHEREuser_name=?">
value="SELECTpermission_nameFROMsec_role_permissionleftjoinsec_roleusing(role_id)leftjoinsec_permissionusing(permission_id)WHERErole_name=?">
















/security/*=anon
/tag=authc




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

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

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



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

[html]view plaincopy


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



LoginPage


loginpage



maxLength="40"/> name="password"/>

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




后台登录代码


[java]view plaincopy


/**
*实际的登录代码
*如果登录成功,跳转至首页;登录失败,则将失败信息反馈对用户
*
*@paramrequest
*@parammodel
*@return
*/
@RequestMapping(value="/dologin")
publicStringdoLogin(HttpServletRequestrequest,Modelmodel){
Stringmsg="";
StringuserName=request.getParameter("userName");
Stringpassword=request.getParameter("password");
System.out.println(userName);
System.out.println(password);
UsernamePasswordTokentoken=newUsernamePasswordToken(userName,password);
token.setRememberMe(true);
Subjectsubject=SecurityUtils.getSubject();
try{
subject.login(token);
if(subject.isAuthenticated()){
return"redirect:/";
}else{
return"login";
}
}catch(IncorrectCredentialsExceptione){
msg="登录密码错误.Passwordforaccount"+token.getPrincipal()+"wasincorrect.";
model.addAttribute("message",msg);
System.out.println(msg);
}catch(ExcessiveAttemptsExceptione){
msg="登录失败次数过多";
model.addAttribute("message",msg);
System.out.println(msg);
}catch(LockedAccountExceptione){
msg="帐号已被锁定.Theaccountforusername"+token.getPrincipal()+"waslocked.";
model.addAttribute("message",msg);
System.out.println(msg);
}catch(DisabledAccountExceptione){
msg="帐号已被禁用.Theaccountforusername"+token.getPrincipal()+"wasdisabled.";
model.addAttribute("message",msg);
System.out.println(msg);
}catch(ExpiredCredentialsExceptione){
msg="帐号已过期.theaccountforusername"+token.getPrincipal()+"wasexpired.";
model.addAttribute("message",msg);
System.out.println(msg);
}catch(UnknownAccountExceptione){
msg="帐号不存在.Thereisnouserwithusernameof"+token.getPrincipal();
model.addAttribute("message",msg);
System.out.println(msg);
}catch(UnauthorizedExceptione){
msg="您没有得到相应的授权!"+e.getMessage();
model.addAttribute("message",msg);
System.out.println(msg);
}
return"login";
}

如果输入不存在的用户名或是错误的密码界面上会有相应的提示信息。

登录成功后,会转至首页,并显示出当前用户名。


分享给朋友:
您可能感兴趣的文章:
随机阅读: