• springmvc,shiro整合


    继之前搭好的框架基础上整合shiro配置。

    地址:http://www.cnblogs.com/mangyang/p/5168291.html

    一、pom.xml

    maven添加shiro的包支持

    <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/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>spring_v1</groupId>
      <artifactId>spring_v1</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>war</packaging>
      
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <springmvc.version>4.0.2.RELEASE</springmvc.version>
        <log4j.version>1.6.6</log4j.version>
        <mysql-connector-java.version>5.1.34</mysql-connector-java.version>
        <shiro.version>1.2.3</shiro.version> 
      </properties>
      
      <dependencies>
          <!-- spring-mvc -->
         <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springmvc.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.webflow</groupId>
            <artifactId>spring-webflow</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>3.0.5.RELEASE</version>
        </dependency> 
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${springmvc.version}</version>
        </dependency>
        <!-- freemarker -->
        <dependency>
              <groupId>org.freemarker</groupId>
              <artifactId>freemarker</artifactId>
              <version>2.3.20</version>
        </dependency>
        <!-- 阿里jdbc -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>0.2.21</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.24</version>
        </dependency> 
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.0.2</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector-java.version}</version>
        </dependency>
        <!-- 解决@ResponseBody返回JSON数据,页面抛出406错误的解决方案。 -->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <!--ehcache 相关包 -->
           <dependency>
          <groupId>net.sf.ehcache</groupId>
          <artifactId>ehcache-core</artifactId>
          <version>2.6.9</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-web</artifactId>
            <version>2.0.4</version>
        </dependency>
        <!-- shiro -->  
        <dependency>  
            <groupId>org.apache.shiro</groupId>  
            <artifactId>shiro-spring</artifactId>  
            <version>${shiro.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.shiro</groupId>  
            <artifactId>shiro-ehcache</artifactId>  
            <version>${shiro.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.shiro</groupId>  
            <artifactId>shiro-core</artifactId>  
            <version>${shiro.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.shiro</groupId>  
            <artifactId>shiro-web</artifactId>  
            <version>${shiro.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.shiro</groupId>  
            <artifactId>shiro-quartz</artifactId>  
            <version>${shiro.version}</version>  
        </dependency>  
       <!-- commons -->
       <dependency>
           <groupId>org.apache.commons</groupId>
           <artifactId>commons-lang3</artifactId>
           <version>3.1</version>
       </dependency>
       <!-- servlet -->
       <dependency> 
           <groupId>javax.servlet</groupId> 
           <artifactId>servlet-api</artifactId> 
           <version>2.5</version> 
       <scope>provided</scope> 
        </dependency>
        <!-- json -->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
      </dependencies>
    </project>

    二、web.xml

    添加shiro拦截配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
        <display-name>spring_v1</display-name>
    
        <!-- 集成Web环境的通用配置 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                classpath*:/spring-application.xml,
                classpath*:/spring-shiro.xml
            </param-value>
        </context-param>
    
        <!-- spring上下文 -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <!-- springMVC 配置 -->
        <servlet>
            <servlet-name>spring-mvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath*:/spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>spring-mvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        
        <!-- Shiro配置 -->    
        <filter>    
          <filter-name>shiroFilter</filter-name>
          <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>    
        </filter>
        <filter-mapping>
          <filter-name>shiroFilter</filter-name>
          <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <!-- 编码格式UTF-8 -->
        <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
    </web-app>

    三、spring-shiro.xml

    <?xml version="1.0" encoding="UTF-8" ?>  
    <beans xmlns="http://www.springframework.org/schema/beans"  
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
           xmlns:aop="http://www.springframework.org/schema/aop"  
           xmlns:tx="http://www.springframework.org/schema/tx"  
           xmlns:context="http://www.springframework.org/schema/context"  
           xsi:schemaLocation="  
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd  
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd  
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  
        <!-- 配置权限管理器 -->  
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">    
            <!-- ref对应我们写的realm  Shiro -->  
            <property name="realm" ref="myRealm"/>      
        </bean>  
        
        <!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 -->  
        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
             <!-- 调用我们配置的权限管理器 -->  
            <property name="securityManager" ref="securityManager" />
            <!-- 配置我们的登录请求地址 -->   
            <property name="loginUrl" value="/login"/>    
            <!-- 配置我们在登录页登录成功后的跳转地址,如果你访问的是非/login地址,则跳到您访问的地址 -->  
            <property name="successUrl" value="/show"/>  
            <!-- 权限配置 --> 
            <property name="filterChainDefinitions">
                <value>
                    /**= authc
                </value>
            </property>
        </bean>
        
        <bean id="myRealm" class="com.shiro.MyRealm">
            <property name="authorizationCacheName" value="authorization" />
            <property name="authenticationTokenClass" value="com.shiro.AdminToken" />
        </bean>
        <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> 
    
    </beans>

     AdminToken.java

    package com.shiro;
    
    import org.apache.shiro.authc.UsernamePasswordToken;
    
    public class AdminToken extends UsernamePasswordToken {
    	public AdminToken(String username, final String password,
    			final boolean rememberMe, final String host) {
    		super(username, password, rememberMe, host);
    	}
    }
    

    MyRealm.java

    package com.shiro;
    
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.List;
    
    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.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.entity.UserRoleAuth;
    import com.service.UserRoleAuthService;
    
    public class MyRealm extends AuthorizingRealm{
    	
    	@Autowired
    	private UserRoleAuthService userRoleAuthService;
    	
    	/* 
    	 * 获取授权信息
    	 * 2016.03.11
    	 */
    	@Override
    	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    		String userName=(String)principals.iterator().next();
    		
    		List<UserRoleAuth> list = userRoleAuthService.findByName(userName);
    		
    		//赋予角色
    		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    		
    		for (UserRoleAuth sra : list) {
    			//保存不重复角色
    			if(info.getRoles()==null ||(!info.getRoles().contains(sra.getRoleName())))
    			{
    				info.addRole(sra.getRoleName());
    			}
    			//保存不重复权限
    			Collection<String> auths = new HashSet<String>();
    			
    			if(!auths.contains(sra.getAuthCode()))
    			{
    				auths.add(sra.getAuthCode());
    			}
    			info.addStringPermissions(auths);
    		}
    	
    		return info;
    	}
    
    	/* 
    	 * 获取认证信息
    	 * 2016.03.11
    	 */
    	@Override
    	protected AuthenticationInfo doGetAuthenticationInfo(
    			AuthenticationToken token) throws AuthenticationException {
    		//获取用户登陆令牌
    		AdminToken myToken = (AdminToken) token; 
    		//获取登陆账号
    		String username = myToken.getUsername();
    		//获取登陆密码
    		String password = new String(myToken.getPassword());
    		
    		return new SimpleAuthenticationInfo(username, password, getName());
    	}
    	@Override
    	public boolean supports(AuthenticationToken token) {
    		return super.supports(token);
    	}
    
    }
    

    sql地址:http://pan.baidu.com/s/1dEZMvYh  配合sql生成工具 实体类等。

    LoginAction.java 的方法(传入账号密码)

    @RequestMapping(value = "", method = RequestMethod.POST)
    	public String login(HttpServletRequest request, HttpServletResponse response,
    			String userName, String userPsw) throws Exception {
    		
    		Subject user = SecurityUtils.getSubject();
    
    		AdminToken token = new AdminToken(userName, userPsw, true, request.getRemoteAddr());
    		token.setRememberMe(true);
    		user.login(token);
    		
    		return "show";
    	}
    

    show.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>   
    <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
     <shiro:hasPermission name="code01">code01权限用户显示此内容</shiro:hasPermission>  
      <shiro:hasPermission name="code02">code02权限用户显示此内容</shiro:hasPermission>  
        <shiro:hasPermission name="code03">code03权限用户显示此内容</shiro:hasPermission>  
     <shiro:hasRole name="superAdmin">superAdmin角色登录显示此内容</shiro:hasRole>  
      <shiro:hasRole name="admin">admin角色登录显示此内容</shiro:hasRole>
      this is show
    </body>
    </html>
    

    完成!

  • 相关阅读:
    hash和history的区别帮助向我一样迷的人弄明白,history和hash
    调用谷歌浏览器的打印所遇到的困难,回流重绘
    webpack简单搭建基础感悟
    linux
    介绍一下call,apply,bind方法实现,源于MDN中的bind
    二进制流转base64加快速度
    手写一个instanceof
    青蛙跳台阶问题
    Django中vue的使用
    pip install 出现 timeout 时的两个临时解决办法
  • 原文地址:https://www.cnblogs.com/mangyang/p/5279039.html
Copyright © 2020-2023  润新知