springmvc 整合shiro

1、引用maven

  <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-web</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-ehcache</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.2.1</version>
    </dependency>

2、实现AuthorizingRealm类

package com.controller;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.apache.shiro.SecurityUtils;
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.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;

public class MyRealm extends AuthorizingRealm{

    /**
     * 该方法在用户检查 角色、权限时调用,实际当中会在这里从数据库中检查用户角色及权限,并存在缓存当中,以便下次快速查询
     * 从数据库检出对应的角色权限后存入 SimpleAuthorizationInfo 对象中。
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
        String currentUsername = (String)super.getAvailablePrincipal(arg0);
        SimpleAuthorizationInfo simpleAuthorInfo = new SimpleAuthorizationInfo();
        if(currentUsername.equals("admin")){
            simpleAuthorInfo.addStringPermission("admin:edit");  //这里硬编码写入 admin角色的edit权限
            //实际中可能会像上面注释的那样从数据库取得
            return simpleAuthorInfo;
        }
        return null;

    }

    /**
     * 该回调方法在用户调用Subject 对象的login方法时调用,这里可以用户名密码检验功能
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken authcToken) throws AuthenticationException {
              UsernamePasswordToken token = (UsernamePasswordToken)authcToken;
            if("user".equals(token.getUsername())||"admin".equals(token.getUsername())){
                AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(token.getUsername(), token.getPassword(), this.getName());
                this.setSession("currentUser", token.getUsername());
                return authcInfo;
            }
            //没有返回登录用户名对应的SimpleAuthenticationInfo对象时,就会在LoginController中抛出UnknownAccountException异常
            return null;
    }

     /**
     * 将一些数据放到ShiroSession中,以便于其它地方使用
     * 比如Controller,使用时直接用HttpSession.getAttribute(key)就可以取到
     */
    private void setSession(Object key, Object value){
        Subject currentUser = SecurityUtils.getSubject();
        if(null != currentUser){
            Session session = currentUser.getSession();
            System.out.println("Session默认超时时间为[" + session.getTimeout() + "]毫秒");
            if(null != session){
                session.setAttribute(key, value);
            }
        }
    }  

}

3、配置applicationContex.xml

    <!-- Shiro Filter -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager" />

    <!-- 登录页面 ,用户 登录不成功自动 返回该页面 -->
    <property name="loginUrl" value="/login" />

    <!-- 登录成功页面,登录成功后跳转到该页面  -->
    <property name="successUrl" value="/index" />

    <!-- 无权访问跳转页面  -->
    <property name="unauthorizedUrl" value="permNo" />

    <!-- 自定义权限页面设置url的访问权限。anon表示不用验证,都可以访问。anthc:authc filter 监听,不登陆不能访问。logout:logout filter监听。没有列出的常用配置:perms["remote:invoke"] :需要角色romote 和权限invoke才能访问。roles["admin"]需要角色admin才能访问。设置可用“,”隔开,如:
    /admin/test = authc,roles[admin]  -->

    <property name="filterChainDefinitions">
        <value>

        <!-- 无参,表示可匿名使用,可以理解为匿名用户或游客 -->
            /login = anon

            /index = authc    

            <!--  只有admin:edit权限才可以访问 index -->
            /permOk = authc,perms[admin:edit]

        </value>
    </property>
</bean>
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="myRealm" />
    </bean>

    <bean id="myRealm" class="com.controller.MyRealm" />

注:黑色部分是上面实现的类,注意包名

4、controller部分

     @RequestMapping(value = "/login",method = {RequestMethod.GET})
        public String login(Model model){
         return "/login";
     }

     @RequestMapping(value = "/login",method = {RequestMethod.POST})
        public String login(HttpServletRequest request, HttpServletResponse response){
         UsernamePasswordToken token = new UsernamePasswordToken(request.getParameter("userName"), request.getParameter("password"));
            token.setRememberMe(true);

            try{

                //获取当前的Subject
                Subject currentUser = SecurityUtils.getSubject();

                currentUser.login(token);
                //验证是否登录成功
                if(currentUser.isAuthenticated()){
                    System.out.println("用户[" + "admin" + "]登录认证通过(这里可以进行一些认证通过后的一些系统参数初始化操作)");
                    return "forward:/index";
                }else{
                    token.clear();
                }
            }
            catch(Exception ex){

            }

         return "/login";
     }

     @RequestMapping(value = "/index")
     public String index(HttpServletRequest request, HttpServletResponse response){
         return "/index";
     }

     @RequestMapping(value = "/permNo")
        public String permNo(HttpServletRequest request, HttpServletResponse response){
         return "/permNo";
     }

     @RequestMapping(value = "/permOk")
        public String permOk(HttpServletRequest request, HttpServletResponse response){
         return "/permOk";
     }

所需jsp页面

login.jsp

<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
<html>
<body>
<form id="contentModel" action="login" method="post">
        <span id="contentModel.errors" class="error">可分别用user、admin用户 测试 密码任意</span>
        <table>
            <tr>
                <td>Name</td>
                <td><input id="userName" name="userName" type="text" value=""/>
                </td>
                <td><span id="userName.errors" class="error"></span>
                </td>
            </tr>
            <tr>
                <td>password</td>
                <td><input id="password" name="password" type="text" value=""/>
                </td>
                <td>
                </td>
            </tr>  

            <tr>
                <td colspan="3"><input type="submit" />
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

index.jsp

<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
<html>
<body>
<h2>${userid}</h2>
<a href="permOk">进入</a>
</body>
</html>

permNo.jsp

<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
<html>
<body>
<h2>你没有权限访问 </h2>
</body>
</html>

permOk.jsp

<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
<html>
<body>
<h2>成功 </h2>
</body>
</html>

最终效果:访问login页面使用user用户登录可以进入到index页面,但不能再进入里面的页面,换成admin用户可以继续往下点击。

时间: 2024-10-10 20:10:01

springmvc 整合shiro的相关文章

SpringMVC整合Shiro——(3)

SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. 第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro过滤系统接收到的请求 --> <!-- 这里filter-name必须对应applicationContext.xml中定义的<bean id="shiroFilter"/> --> <!-- 使用[/*]匹配所有请求,保证所有的可控请求都经过Shiro

SpringMVC整合Shiro权限框架

尊重原创:http://blog.csdn.net/donggua3694857/article/details/52157313 最近在学习Shiro,首先非常感谢开涛大神的<跟我学Shiro>系列,在我学习的过程中发挥了很大的指导作用.学习一个新的东西首先就是做一个demo,多看不如多敲,只有在实践中才能发现自己的欠缺,下面记录下来我整合shiro的过程.如果有不足之处,还望各位看官多多指出. 一.基本名词解释 Apache Shiro是一个强大易用的Java安全框架.它可以帮助我们完成:

springmvc 整合shiro 整合 druid

A 代码生成器(开发利器);  B 阿里数据库连接池druid;  C 安全权限框架shiro  系统为主流的 springmvc+mybaits 3.2 版本 ,提供maven的pom.xml文件,另免费赠送hibernate版本一套(垮数据库) 1. 有 oracle .msyql.spring3.0.spring4.0  一共 4 套版本全部提供没有打jar没有加密的源代码(最下面截图2.1版本)  2. 支持APP手机应用(android和ios)接口调用 ,传输验证可用 shiro 的

SpringMVC整合Shiro

  首先是web.xml  <?xml version="1.0" encoding="UTF-8"?>   <web-app version="2.5"       xmlns="http://java.sun.com/xml/ns/javaee"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:

SpringMVC整合Shiro(配解释)

第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro过滤系统接收到的请求 --> <!-- 这里filter-name必须对应applicationContext.xml中定义的<bean id="shiroFilter"/> --> <!-- 使用[/*]匹配所有请求,保证所有的可控请求都经过Shiro的过滤 --> <!-- 通常会将此filter-mapping放置到最前面(即其他filter-mappi

springMVC和Shiro框架整合使用简单示例 【转】

一.目录结构 首先是目录结构如图: 二.pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0

SpringMVC+Apache Shiro+JPA(hibernate)整合配置

序: 关于标题: 说是教学,实在愧不敢当,但苦与本人文笔有限,实在找不到更合理,谦逊的词语表达,只能先这样定义了. 其实最真实的想法,只是希望这个关键词能让更多的人浏览到这篇文章,也算是对于自己写文章的一个肯定吧.^_^! 关于内容: 再写这系列文章之前,本人和许多人一样都是伸手党,并深深的了解咱伸手党且英文较差的朋友对于新知识的学习及获取中文资料少的痛苦.所以本着"取之于民,共享与民"的原则,记录下实际工作中对SpringMVC+Shiro整合应用的部分心得.本人技术水平有限,仅希望

模块化服务化原框架整合Springmvc+mybatis+shiro+bootstrap+html5

源码地址获取  1. 使用阿里巴巴Druid连接池(高效.功能强大.可扩展性好的数据库连接池.监控数据库访问性能.支持Common-Logging.Log4j和JdkLog,监控数据库访问) 2. 提供高并发JMS消息处理机制3. 所有功能模块化.所有模块服务化.所有服务原子化的方式,提供可拓展的服务模型,使程序稳定运行,永不宕机4. 提供Wink Rest.Webservice服务,故可作为独立服务平台部署 框架整合: Springmvc + Mybatis + Shiro(权限) + RES

【javaWeb框架整合】springmvc+mybatis+shiro+restful+Webservice+bootstrap+html5

开发报捷:增加Lucene搜索引擎功能 1. 创建.初始化索引.统一搜索入口.搜索结果展现--内容.标题高亮.关键词搜索 2. 高级搜索:高级搜索增加多入口查询(精确查询.模糊查询.前缀查询等),每页显示条数自定义.索引结果数据设置.选择索引文档类型等) 集成lucene搜索引擎: 1. 使用阿里巴巴Druid连接池(高效.功能强大.可扩展性好的数据库连接池.监控数据库访问性能.支持Common-Logging.Log4j和JdkLog,监控数据库访问) 2. 提供高并发JMS消息处理机制 3.