Apache Shiro之实际运用(整合到Spring中)将Shiro整到SSM中(基于maven)

将Shiro整到SSM中(基于maven)

--------------------------------------------------------------------------------------------------------------------

    Shiro整到Spring中后,我们自定义的realm啊、securityManager等都会交给spring去管理了,包括我们需要指定哪些url需要做什么样的验证,都是交给spring,也就是说,完全可以摆脱原来的那个.ini配置文件了,Shiro部分参考了它的官方文档:http://shiro.apache.org/spring.html

1.


2.配置文件

2.1 pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   <groupId>com.demo</groupId>  
  5.   <artifactId>shiro</artifactId>  
  6.   <packaging>war</packaging>  
  7.   <version>1.0-SNAPSHOT</version>  
  8.   <name>shiro Maven Webapp</name>  
  9.   <url>http://maven.apache.org</url>  
  10.   <dependencies>  
  11.     <!-- shiro核心包 -->  
  12.     <dependency>  
  13.       <groupId>org.apache.shiro</groupId>  
  14.       <artifactId>shiro-core</artifactId>  
  15.       <version>1.2.5</version>  
  16.     </dependency>  
  17.     <!-- 添加shiro web支持 -->  
  18.     <dependency>  
  19.       <groupId>org.apache.shiro</groupId>  
  20.       <artifactId>shiro-web</artifactId>  
  21.       <version>1.2.5</version>  
  22.     </dependency>  
  23.     <!-- 添加shiro spring支持 -->  
  24.     <dependency>  
  25.       <groupId>org.apache.shiro</groupId>  
  26.       <artifactId>shiro-spring</artifactId>  
  27.       <version>1.2.5</version>  
  28.     </dependency>  
  29.     <!-- 添加sevlet支持 -->  
  30.     <dependency>  
  31.       <groupId>javax.servlet</groupId>  
  32.       <artifactId>javax.servlet-api</artifactId>  
  33.       <version>3.1.0</version>  
  34.     </dependency>  
  35.     <!-- 添加jsp支持 -->  
  36.     <dependency>  
  37.       <groupId>javax.servlet.jsp</groupId>  
  38.       <artifactId>javax.servlet.jsp-api</artifactId>  
  39.       <version>2.3.1</version>  
  40.     </dependency>  
  41.     <!-- 添加jstl支持 -->  
  42.     <dependency>  
  43.       <groupId>javax.servlet</groupId>  
  44.       <artifactId>jstl</artifactId>  
  45.       <version>1.2</version>  
  46.     </dependency>  
  47.     <!-- 添加log4j日志 -->  
  48.     <dependency>  
  49.       <groupId>log4j</groupId>  
  50.       <artifactId>log4j</artifactId>  
  51.       <version>1.2.17</version>  
  52.     </dependency>  
  53.     <dependency>  
  54.       <groupId>commons-logging</groupId>  
  55.       <artifactId>commons-logging</artifactId>  
  56.       <version>1.2</version>  
  57.     </dependency>  
  58.     <dependency>  
  59.       <groupId>org.slf4j</groupId>  
  60.       <artifactId>slf4j-api</artifactId>  
  61.       <version>1.7.21</version>  
  62.     </dependency>  
  63.   
  64.     <!-- 添加spring支持 -->  
  65.     <dependency>  
  66.       <groupId>org.springframework</groupId>  
  67.       <artifactId>spring-core</artifactId>  
  68.       <version>4.3.0.RELEASE</version>  
  69.     </dependency>  
  70.     <dependency>  
  71.       <groupId>org.springframework</groupId>  
  72.       <artifactId>spring-beans</artifactId>  
  73.       <version>4.3.0.RELEASE</version>  
  74.     </dependency>  
  75.     <dependency>  
  76.       <groupId>org.springframework</groupId>  
  77.       <artifactId>spring-context</artifactId>  
  78.       <version>4.3.0.RELEASE</version>  
  79.     </dependency>  
  80.     <dependency>  
  81.       <groupId>org.springframework</groupId>  
  82.       <artifactId>spring-context-support</artifactId>  
  83.       <version>4.3.0.RELEASE</version>  
  84.     </dependency>  
  85.     <dependency>  
  86.       <groupId>org.springframework</groupId>  
  87.       <artifactId>spring-web</artifactId>  
  88.       <version>4.3.0.RELEASE</version>  
  89.     </dependency>  
  90.     <dependency>  
  91.       <groupId>org.springframework</groupId>  
  92.       <artifactId>spring-webmvc</artifactId>  
  93.       <version>4.3.0.RELEASE</version>  
  94.     </dependency>  
  95.     <dependency>  
  96.       <groupId>org.springframework</groupId>  
  97.       <artifactId>spring-tx</artifactId>  
  98.       <version>4.3.0.RELEASE</version>  
  99.     </dependency>  
  100.     <dependency>  
  101.       <groupId>org.springframework</groupId>  
  102.       <artifactId>spring-jdbc</artifactId>  
  103.       <version>4.3.0.RELEASE</version>  
  104.     </dependency>  
  105.     <dependency>  
  106.       <groupId>org.springframework</groupId>  
  107.       <artifactId>spring-aop</artifactId>  
  108.       <version>4.3.0.RELEASE</version>  
  109.     </dependency>  
  110.     <dependency>  
  111.       <groupId>org.springframework</groupId>  
  112.       <artifactId>spring-aspects</artifactId>  
  113.       <version>4.3.0.RELEASE</version>  
  114.     </dependency>  
  115.   
  116.     <!-- 添加mybatis支持 -->  
  117.     <dependency>  
  118.       <groupId>org.mybatis</groupId>  
  119.       <artifactId>mybatis</artifactId>  
  120.       <version>3.4.0</version>  
  121.     </dependency>  
  122.     <dependency>  
  123.       <groupId>org.mybatis</groupId>  
  124.       <artifactId>mybatis-spring</artifactId>  
  125.       <version>1.3.0</version>  
  126.     </dependency>  
  127.   
  128.     <dependency>  
  129.       <groupId>com.oracle</groupId>  
  130.       <artifactId>ojdbc14</artifactId>  
  131.       <version>11.1.0.6.0</version>  
  132.     </dependency>  
  133.   
  134.     <dependency>  
  135.       <groupId>junit</groupId>  
  136.       <artifactId>junit</artifactId>  
  137.       <version>4.12</version>  
  138.       <scope>test</scope>  
  139.     </dependency>  
  140.   </dependencies>  
  141.   <build>  
  142.     <finalName>shiro</finalName>  
  143.   </build>  
  144. </project>  
  145. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  146.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  147.   <modelVersion>4.0.0</modelVersion>  
  148.   <groupId>com.demo</groupId>  
  149.   <artifactId>shiro</artifactId>  
  150.   <packaging>war</packaging>  
  151.   <version>1.0-SNAPSHOT</version>  
  152.   <name>shiro Maven Webapp</name>  
  153.   <url>http://maven.apache.org</url>  
  154.   <dependencies>  
  155.     <!-- shiro核心包 -->  
  156.     <dependency>  
  157.       <groupId>org.apache.shiro</groupId>  
  158.       <artifactId>shiro-core</artifactId>  
  159.       <version>1.2.5</version>  
  160.     </dependency>  
  161.     <!-- 添加shiro web支持 -->  
  162.     <dependency>  
  163.       <groupId>org.apache.shiro</groupId>  
  164.       <artifactId>shiro-web</artifactId>  
  165.       <version>1.2.5</version>  
  166.     </dependency>  
  167.     <!-- 添加shiro spring支持 -->  
  168.     <dependency>  
  169.       <groupId>org.apache.shiro</groupId>  
  170.       <artifactId>shiro-spring</artifactId>  
  171.       <version>1.2.5</version>  
  172.     </dependency>  
  173.     <!-- 添加sevlet支持 -->  
  174.     <dependency>  
  175.       <groupId>javax.servlet</groupId>  
  176.       <artifactId>javax.servlet-api</artifactId>  
  177.       <version>3.1.0</version>  
  178.     </dependency>  
  179.     <!-- 添加jsp支持 -->  
  180.     <dependency>  
  181.       <groupId>javax.servlet.jsp</groupId>  
  182.       <artifactId>javax.servlet.jsp-api</artifactId>  
  183.       <version>2.3.1</version>  
  184.     </dependency>  
  185.     <!-- 添加jstl支持 -->  
  186.     <dependency>  
  187.       <groupId>javax.servlet</groupId>  
  188.       <artifactId>jstl</artifactId>  
  189.       <version>1.2</version>  
  190.     </dependency>  
  191.     <!-- 添加log4j日志 -->  
  192.     <dependency>  
  193.       <groupId>log4j</groupId>  
  194.       <artifactId>log4j</artifactId>  
  195.       <version>1.2.17</version>  
  196.     </dependency>  
  197.     <dependency>  
  198.       <groupId>commons-logging</groupId>  
  199.       <artifactId>commons-logging</artifactId>  
  200.       <version>1.2</version>  
  201.     </dependency>  
  202.     <dependency>  
  203.       <groupId>org.slf4j</groupId>  
  204.       <artifactId>slf4j-api</artifactId>  
  205.       <version>1.7.21</version>  
  206.     </dependency>  
  207.   
  208.     <!-- 添加spring支持 -->  
  209.     <dependency>  
  210.       <groupId>org.springframework</groupId>  
  211.       <artifactId>spring-core</artifactId>  
  212.       <version>4.3.0.RELEASE</version>  
  213.     </dependency>  
  214.     <dependency>  
  215.       <groupId>org.springframework</groupId>  
  216.       <artifactId>spring-beans</artifactId>  
  217.       <version>4.3.0.RELEASE</version>  
  218.     </dependency>  
  219.     <dependency>  
  220.       <groupId>org.springframework</groupId>  
  221.       <artifactId>spring-context</artifactId>  
  222.       <version>4.3.0.RELEASE</version>  
  223.     </dependency>  
  224.     <dependency>  
  225.       <groupId>org.springframework</groupId>  
  226.       <artifactId>spring-context-support</artifactId>  
  227.       <version>4.3.0.RELEASE</version>  
  228.     </dependency>  
  229.     <dependency>  
  230.       <groupId>org.springframework</groupId>  
  231.       <artifactId>spring-web</artifactId>  
  232.       <version>4.3.0.RELEASE</version>  
  233.     </dependency>  
  234.     <dependency>  
  235.       <groupId>org.springframework</groupId>  
  236.       <artifactId>spring-webmvc</artifactId>  
  237.       <version>4.3.0.RELEASE</version>  
  238.     </dependency>  
  239.     <dependency>  
  240.       <groupId>org.springframework</groupId>  
  241.       <artifactId>spring-tx</artifactId>  
  242.       <version>4.3.0.RELEASE</version>  
  243.     </dependency>  
  244.     <dependency>  
  245.       <groupId>org.springframework</groupId>  
  246.       <artifactId>spring-jdbc</artifactId>  
  247.       <version>4.3.0.RELEASE</version>  
  248.     </dependency>  
  249.     <dependency>  
  250.       <groupId>org.springframework</groupId>  
  251.       <artifactId>spring-aop</artifactId>  
  252.       <version>4.3.0.RELEASE</version>  
  253.     </dependency>  
  254.     <dependency>  
  255.       <groupId>org.springframework</groupId>  
  256.       <artifactId>spring-aspects</artifactId>  
  257.       <version>4.3.0.RELEASE</version>  
  258.     </dependency>  
  259.   
  260.     <!-- 添加mybatis支持 -->  
  261.     <dependency>  
  262.       <groupId>org.mybatis</groupId>  
  263.       <artifactId>mybatis</artifactId>  
  264.       <version>3.4.0</version>  
  265.     </dependency>  
  266.     <dependency>  
  267.       <groupId>org.mybatis</groupId>  
  268.       <artifactId>mybatis-spring</artifactId>  
  269.       <version>1.3.0</version>  
  270.     </dependency>  
  271.   
  272.     <dependency>  
  273.       <groupId>com.oracle</groupId>  
  274.       <artifactId>ojdbc14</artifactId>  
  275.       <version>11.1.0.6.0</version>  
  276.     </dependency>  
  277.   
  278.     <dependency>  
  279.       <groupId>junit</groupId>  
  280.       <artifactId>junit</artifactId>  
  281.       <version>4.12</version>  
  282.       <scope>test</scope>  
  283.     </dependency>  
  284.   </dependencies>  
  285.   <build>  
  286.     <finalName>shiro</finalName>  
  287.   </build>  
  288. </project>  
2.2 log4j.properties
  1. log4j.rootLogger=DEBUG, Console    
  2.   
  3. #Console    
  4. log4j.appender.Console=org.apache.log4j.ConsoleAppender    
  5. log4j.appender.Console.layout=org.apache.log4j.PatternLayout    
  6. log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n    
  7.   
  8. log4j.logger.java.sql.ResultSet=INFO    
  9. log4j.logger.org.apache=INFO    
  10. log4j.logger.java.sql.Connection=DEBUG    
  11. log4j.logger.java.sql.Statement=DEBUG    
  12. log4j.logger.java.sql.PreparedStatement=DEBUG    

2.3 web.xml(有待修改)
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  
  3.   <display-name>ShiroSpring</display-name>  
  4.   <welcome-file-list>  
  5.     <welcome-file>index.jsp</welcome-file>  
  6.   </welcome-file-list>  
  7.   
  8.   <!-- spring监听器 -->  
  9.   <listener>  
  10.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  11.   </listener>  
  12.   <context-param>  
  13.     <param-name>contextConfigLocation</param-name>  
  14.     <param-value>classpath:applicationContext.xml</param-value>  
  15.   </context-param>  
  16.   
  17.   <!-- 添加springmvc支持 -->  
  18.   <servlet>  
  19.     <servlet-name>springMVC</servlet-name>  
  20.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  21.     <init-param>  
  22.         <param-name>contextConfigLocation</param-name>  
  23.         <param-value>classpath:spring-mvc.xml</param-value>  
  24.     </init-param>  
  25.   </servlet>  
  26.   <servlet-mapping>  
  27.     <servlet-name>springMVC</servlet-name>  
  28.     <url-pattern>*.do</url-pattern>  
  29.   </servlet-mapping>  
  30.   
  31.   <!-- 添加shiro过滤器 -->  
  32.   <filter>  
  33.     <filter-name>shiroFilter</filter-name>  
  34.     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  35.     <init-param>  
  36.         <!-- 该值缺省为false,表示声明周期由SpringApplicationContext管理,设置为true表示ServletContainer管理 -->  
  37.         <param-name>targetFilterLifecycle</param-name>  
  38.         <param-value>true</param-value>  
  39.     </init-param>  
  40.   </filter>  
  41.   <filter-mapping>  
  42.     <filter-name>shiroFilter</filter-name>  
  43.     <url-pattern>/*</url-pattern>  
  44.   </filter-mapping>  
  45.   
  46.   <!-- 编码过滤器 -->  
  47.   <filter>  
  48.     <filter-name>encodingFilter</filter-name>  
  49.     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  50.     <async-supported>true</async-supported>  
  51.     <init-param>  
  52.         <param-name>encoding</param-name>  
  53.         <param-value>UTF-8</param-value>  
  54.     </init-param>  
  55.   </filter>  
  56.   <filter-mapping>  
  57.     <filter-name>encodingFilter</filter-name>  
  58.     <url-pattern>/*</url-pattern>  
  59.   </filter-mapping>  
  60. </web-app>  
2.4  applicationContext.xml(核心配置)
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:p="http://www.springframework.org/schema/p"  
  5.        xmlns:aop="http://www.springframework.org/schema/aop"  
  6.        xmlns:context="http://www.springframework.org/schema/context"  
  7.        xmlns:jee="http://www.springframework.org/schema/jee"  
  8.        xmlns:tx="http://www.springframework.org/schema/tx"  
  9.        xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
  10.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  11.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  12.         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd  
  13.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">  
  14.   
  15.     <!-- 自动扫描 -->  
  16.     <context:component-scan base-package="demo.service" />  
  17.   
  18.     <!--配置数据源-->  
  19.     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  20.         <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>  
  21.         <property name="url" value="jdbc:oracle:thin:@192.168.6.34:1521:orcl"/>  
  22.         <property name="username" value="scott"/>  
  23.         <property name="password" value="tiger"/>  
  24.     </bean>  
  25.   
  26.     <!--配置mybatis的sqlSessionFactory-->  
  27.     <bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  28.         <property name="dataSource" ref="dataSource"/>  
  29.         <!-- 自动扫描mappers.xml文件 -->  
  30.         <property name="mapperLocations" value="classpath:demo/mappers/*.xml "/>  
  31.         <!--mybatis配置文件-->  
  32.         <property name="configLocation" value="classpath:mybatis-config.xml"/>  
  33.     </bean>  
  34.   
  35.     <!--DAO接口所在包名,spring 会自动查找其下的-->  
  36.     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  37.         <property name="basePackage" value="demo.dao"/>  
  38.         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>  
  39.     </bean>  
  40.   
  41.     <!--自定义Realm-->  
  42.     <bean id="myRealm" class="demo.realm.MyRealm"/>  
  43.   
  44.     <!--安全管理-->  
  45.     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  46.         <property name="realm" ref="myRealm"></property>  
  47.     </bean>  
  48.   
  49.     <!--shiro 过滤器-->  
  50.     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  51.         <!-- Shiro过滤器的核心安全接口,这个属性是必须的-->  
  52.         <property name="securityManager" ref="securityManager"/>  
  53.         <!--身份认证失败,则跳转到登录页面的配置-->  
  54.         <property name="loginUrl" value="/login.jsp"/>  
  55.         <!--权限认证失败,则跳转到指定页面-->  
  56.         <property name="unauthorizedUrl" value="/unauthorized.jsp"/>  
  57.         <!-- Shiro连接约束配置,即过滤链的定义-->  
  58.         <property name="filterChainDefinitions">  
  59.             <value>  
  60.                 /login=anon  
  61.                 /user/admin*=autho  
  62.                 /user/student*/**=roles[teacher]  
  63.                 /user/teacher*/**=perms["user:create"]  
  64.             </value>  
  65.         </property>  
  66.     </bean>  
  67. </beans>  

3.整合Mybatis

3.1全局配置文件

    首先配置一个mybatis的全局配置文件mybatis-config.xml,因为数据源都交给spring管理了,所以全局配置文件就比较清晰了。

   mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE configuration  
  3.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  4.         "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5. <configuration>  
  6.     <!-- 别名 -->  
  7.     <typeAliases>  
  8.         <package name="demo.entity"/>  
  9.     </typeAliases>  
  10. </configuration>  
3.2配置mapper映射文件

    UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper  
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <mapper>  
  6.     <select id="getByUsername" parameterType="String" resultType="user">  
  7.         select * from tb_user where username=#{username}  
  8.     </select>  
  9.   
  10.     <select id="getRoles" parameterType="String" resultType="String">  
  11.         select r.rolename  from t_user u,t_role r where u.role_id=r.id and u.username=#{username}  
  12.     </select>  
  13.   
  14.     <select id="getPermissions" parameterType="String" resultType="String">  
  15.         select p.permissionname from t_user u,t_role r,t_permission p where u.role_id=r.id and p.role_id=r.id  
  16.         and u.username=#{username}  
  17.     </select>  
  18. </mapper>  
3.3mapper接口(UserDao)
  1. public interface UserDao {  
  2.     public User getByUsername(String username);  
  3.   
  4.     public Set<String> getRoles(String username);  
  5.   
  6.     public Set<String> getPermissions(String username);  
  7.   
  8. }  
    只需要写接口,不需要写实现,spring的配置文件中会去扫描mapper,会自动创建一个代理对象来执行相应的方法,要注意的是这个接口的方法名要和上面mapper映射文件的id号一样的,否则是无法映射到具体的statement上面的,会报错。


3.4 entity类

    这里写个简单的User类

  1. public class User {  
  2.     private Integer  id;  
  3.     private String username;  
  4.     private String password;  
  5.     //get set方法省略  
  6.   
  7. }  
3.5  Service
    接口UserService.java
  1. public interface UserService {  
  2.     public User getByUsername(String username);  
  3.   
  4.     public Set<String> getRoles(String username);  
  5.   
  6.     public Set<String> getPermissions(String username);  
  7.   
  8. }  

    UserServiceImpl.java

  1. @Service("userService")  
  2. public class UserServiceImpl implements UserService {  
  3.     @Resource  
  4.     private UserDao userDao;  
  5.     public User getByUsername(String username){  
  6.             return userDao.getByUsername(username);  
  7.     }  
  8.     public Set<String> getRoles(String username){  
  9.             return userDao.getRoles(username);  
  10.     }  
  11.     public Set<String> getPermissions(String username){  
  12.            return userDao.getPermissions(username);  
  13.     }  
  14. }  
在service的实现类中,注入刚刚写好的dao接口即可调用其中的方法了,使用的是spring自动创建的代理对象去执行的。

4 整合SpringMVC

4.1配置文件

spring-mvc.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:p="http://www.springframework.org/schema/p"  
  5.        xmlns:aop="http://www.springframework.org/schema/aop"  
  6.        xmlns:context="http://www.springframework.org/schema/context"  
  7.        xmlns:jee="http://www.springframework.org/schema/jee"  
  8.        xmlns:tx="http://www.springframework.org/schema/tx"  
  9.        xsi:schemaLocation="  
  10.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
  11.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  12.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  13.         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd  
  14.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">  
  15. <!-- 使用注解的包,包括子集-->  
  16. <context:component-scan base-package="demo.controller"/>  
  17.   
  18. <!--视图解析器-->  
  19. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  20.     <property name="prefix" value="/"></property>  
  21.     <property name="suffix" value=".jsp"></property>  
  22. </bean>  
  23. </beans>  

4.2 Controller

    UserController.java

  1. package demo.controller;  
  2.   
  3. import demo.entity.User;  
  4. import org.apache.shiro.SecurityUtils;  
  5. import org.apache.shiro.authc.UsernamePasswordToken;  
  6. import org.apache.shiro.subject.Subject;  
  7. import org.springframework.web.bind.annotation.RequestMapping;  
  8. import org.springframework.stereotype.Controller;  
  9. import javax.servlet.http.HttpServletRequest;  
  10.   
  11. @Controller  
  12. @RequestMapping("/user")  
  13. public class UserController {  
  14.     //用户登录  
  15.     @RequestMapping("/login")  
  16.     public String login(User user, HttpServletRequest request){  
  17.   
  18.         Subject subject=SecurityUtils.getSubject();  
  19.         UsernamePasswordToken token=new UsernamePasswordToken(user.getUsername(),user.getPassword());  
  20.         try {  
  21.             //调用subject.login(token)进行登录,会自动委托给securityManager,调用之前  
  22.             subject.login(token);//会跳到我们自定义的realm中  
  23.             request.getSession().setAttribute("user",user);  
  24.             return "success";  
  25.         }catch (Exception e){  
  26.             e.printStackTrace();  
  27.             request.getSession().setAttribute("user",user);  
  28.             request.setAttribute("error","用户名或密码错误");  
  29.             return "login";  
  30.         }  
  31.     }  
  32.   
  33.     @RequestMapping("/logout")  
  34.     public String logout(HttpServletRequest request){  
  35.         request.getSession().invalidate();  
  36.         return "index";  
  37.     }  
  38.   
  39.     @RequestMapping("/admin")  
  40.     public String admin(HttpServletRequest request){  
  41.         return "success";  
  42.     }  
  43.   
  44.     @RequestMapping("/student")  
  45.     public String student(HttpServletRequest request){  
  46.         return "success";  
  47.     }  
  48.   
  49.     @RequestMapping("/teacher")  
  50.     public String teacher(HttpServletRequest request){  
  51.         return "success";  
  52.     }  
  53. }  
4.3完成自定义的realm

    上面用户登录会执行一个subject.login(token);这里会跳转到我们自定义的realm中,接下来就定义一下我们自己的realm,由于这里是和mybatis整合了,所以不需要原来的那个Dbutil去连接数据库了,直接使用mybatis中的mapper接口,也就是上面写的dao。

  1. public class MyRealm extends AuthorizingRealm {  
  2.     @Resource  
  3.     private UserServiceImpl userServiceImpl;  
  4.   
  5.     //为当前登录成功的用户授予权限和角色,已经登录成功了。  
  6.     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
  7.         String username=(String) principals.getPrimaryPrincipal();  
  8.         SimpleAuthorizationInfo  authorizationInfo=new SimpleAuthorizationInfo();  
  9.         authorizationInfo.setRoles(userServiceImpl.getRoles(username));  
  10.         authorizationInfo.setStringPermissions(userServiceImpl.getPermissions(username));  
  11.         return authorizationInfo;  
  12.     }  
  13.     //验证当前登录的用户,获取认证信息。  
  14.     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {  
  15.         String username=(String) token.getPrincipal();//获取用户名  
  16.         User user=userServiceImpl.getByUsername(username);  
  17.         if(user!=null){  
  18.             AuthenticationInfo authcInfo =new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(),"myRealm");  
  19.             return authcInfo;  
  20.         }else{  
  21.             return null;  
  22.         }  
  23.     }  
  24. }  
5.几个jsp页面

login.jsp

  1. <body>  
  2.     <form action="${pageContext.request.contextPath }/user/login.do" method="post">  
  3.         username:<input type="text" name="username"/><br>  
  4.         password:<input type="password" name="password"/><br>  
  5.         <input type="submit" value="登录">${error}  
  6.     </form>  
  7. </body>  
success.jsp
  1. <body>  
  2.     欢迎你${user.username}  
  3.     <a href="/user/logout.do">退出</a>  
  4. </body>  

unauthorized.jsp

  1. <body>  
  2.      认证未通过,或者权限不足  
  3.      <a href="${pageContext.request.contextPath}/user/login.do">退出</a>  
  4. </body>  
6.测试

    根据spring的配置文件中对shiro的url拦截配置,我们首先请求:http://localhost:8080/ShiroSpring/user/admin.do来测试身份认证,然后会跳转到登录页面让我们登录,登录成功后,再次请求这个url就会进入success.jsp页面了。

    再测试角色和权限认证,可以先后输入http://localhost:8080/ShiroSpring/user/student.do来测试角色认证,输入http://localhost:8080/ShiroSpring/user/teacher.do来测试权限认证。通过登陆不同的用户去测试即可。















猜你喜欢

转载自blog.csdn.net/wota5037/article/details/79046191