SpringMVC+SpringMVC+Mybatis项目

1:导入相关依赖

  1. <dependencies>
  2. <!--测试依赖-->
  3. <dependency>
  4. <groupId>junit</groupId>
  5. <artifactId>junit</artifactId>
  6. <version>4.11</version>
  7. <scope>test</scope>
  8. </dependency>
  9. <!--数据库驱动-->
  10. <dependency>
  11. <groupId>mysql</groupId>
  12. <artifactId>mysql-connector-java</artifactId>
  13. <version>5.1.47</version>
  14. </dependency>
  15. <!-- 数据库连接池 -->
  16. <dependency>
  17. <groupId>com.mchange</groupId>
  18. <artifactId>c3p0</artifactId>
  19. <version>0.9.5.2</version>
  20. </dependency>
  21. <!-- 数据库连接池 -->
  22. <dependency>
  23. <groupId>com.alibaba</groupId>
  24. <artifactId>druid</artifactId>
  25. <version>1.1.22</version>
  26. </dependency>
  27. <!--Mybatis-->
  28. <dependency>
  29. <groupId>org.mybatis</groupId>
  30. <artifactId>mybatis</artifactId>
  31. <version>3.5.2</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.mybatis</groupId>
  35. <artifactId>mybatis-spring</artifactId>
  36. <version>2.0.2</version>
  37. </dependency>
  38. <!--spring 数据源配置-->
  39. <dependency>
  40. <groupId>org.springframework</groupId>
  41. <artifactId>spring-jdbc</artifactId>
  42. <version>5.1.9.RELEASE</version>
  43. </dependency>
  44. <!--lombok-->
  45. <dependency>
  46. <groupId>org.projectlombok</groupId>
  47. <artifactId>lombok</artifactId>
  48. <version>1.18.10</version>
  49. </dependency>
  50. <!--AOP的jar包-->
  51. <dependency>
  52. <groupId>org.aspectj</groupId>
  53. <artifactId>aspectjweaver</artifactId>
  54. <version>1.9.4</version>
  55. </dependency>
  56. <!--Spring依赖-->
  57. <dependency>
  58. <groupId>org.springframework</groupId>
  59. <artifactId>spring-webmvc</artifactId>
  60. <version>5.1.9.RELEASE</version>
  61. </dependency>
  62. <dependency>
  63. <groupId>javax.servlet.jsp</groupId>
  64. <artifactId>jsp-api</artifactId>
  65. <version>2.2</version>
  66. </dependency>
  67. <dependency>
  68. <groupId>javax.servlet</groupId>
  69. <artifactId>jstl</artifactId>
  70. <version>1.2</version>
  71. </dependency>
  72. <dependency>
  73. <groupId>javax.servlet</groupId>
  74. <artifactId>servlet-api</artifactId>
  75. <version>2.5</version>
  76. </dependency>
  77. <!--shiro核心包依赖-->
  78. <dependency>
  79. <groupId>org.apache.shiro</groupId>
  80. <artifactId>shiro-core</artifactId>
  81. <version>1.4.0</version>
  82. </dependency>
  83. <!--shiro web包依赖-->
  84. <dependency>
  85. <groupId>org.apache.shiro</groupId>
  86. <artifactId>shiro-web</artifactId>
  87. <version>1.4.0</version>
  88. </dependency>
  89. </dependencies>
  90. <!--maven 静态资源管理,主要是为了导出mapper-->
  91. <build>
  92. <resources>
  93. <resource>
  94. <directory>src/main/java</directory>
  95. <includes>
  96. <include>**/*.properties</include>
  97. <include>**/*.xml</include>
  98. <include>**/*.ini</include>
  99. </includes>
  100. <filtering>false</filtering>
  101. </resource>
  102. <resource>
  103. <directory>src/main/resources</directory>
  104. <includes>
  105. <include>**/*.properties</include>
  106. <include>**/*.xml</include>
  107. <include>**/*.ini</include>
  108. </includes>
  109. <filtering>false</filtering>
  110. </resource>
  111. </resources>
  112. </build>

2:数据库建表语句

  1. /*用户表*/
  2. CREATE TABLE `t_user` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `username` varchar(20) NOT NULL,
  5. `password` varchar(100) NOT NULL,
  6. PRIMARY KEY (`id`),
  7. UNIQUE KEY `username` (`username`)
  8. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
  9. INSERT INTO `t_user` VALUES ('1', 'songsong', '123');
  10. INSERT INTO `t_user` VALUES ('2', 'yuanhang', '456');
  11. /*角色表*/
  12. CREATE TABLE `t_role` (
  13. `id` int(11) NOT NULL AUTO_INCREMENT,
  14. `role_name` varchar(50) NOT NULL,
  15. `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  16. PRIMARY KEY (`id`),
  17. UNIQUE KEY `role_name` (`role_name`)
  18. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
  19. INSERT INTO `t_role` VALUES ('1', 'banzhang', '2019-10-10 00:00:00');
  20. INSERT INTO `t_role` VALUES ('2', 'student', '2019-10-09 00:00:00');
  21. /*权限表*/
  22. CREATE TABLE `t_permission` (
  23. `id` int(11) NOT NULL AUTO_INCREMENT,
  24. `permission_name` varchar(50) NOT NULL,
  25. `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  26. PRIMARY KEY (`id`),
  27. UNIQUE KEY `permission_name` (`permission_name`)
  28. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
  29. INSERT INTO `t_permission` VALUES ('1', 'student:yq', '2019-10-09 00:00:00');
  30. INSERT INTO `t_permission` VALUES ('2', 'student:study', '2019-10-09 00:00:00');
  31. /*用户 角色关联表*/
  32. CREATE TABLE `t_user_role` (
  33. `id` int(11) NOT NULL AUTO_INCREMENT,
  34. `user_id` int(11) DEFAULT NULL,
  35. `role_id` int(11) DEFAULT NULL,
  36. PRIMARY KEY (`id`),
  37. UNIQUE KEY `user_id` (`user_id`,`role_id`)
  38. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
  39. INSERT INTO `t_user_role` VALUES ('1', '1', '1');
  40. INSERT INTO `t_user_role` VALUES ('3', '1', '2');
  41. INSERT INTO `t_user_role` VALUES ('2', '2', '2');
  42. /*角色 权限关联表*/
  43. CREATE TABLE `t_role_permission` (
  44. `id` int(11) NOT NULL AUTO_INCREMENT,
  45. `permission_id` int(11) DEFAULT NULL,
  46. `role_id` int(11) DEFAULT NULL,
  47. PRIMARY KEY (`id`),
  48. UNIQUE KEY `permission_id` (`permission_id`,`role_id`)
  49. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
  50. INSERT INTO `t_role_permission` VALUES ('1', '1', '1');
  51. INSERT INTO `t_role_permission` VALUES ('2', '2', '1');
  52. INSERT INTO `t_role_permission` VALUES ('3', '2', '2');

3:构建javaben对象

com\shiro\vo\UserVo.java

  1. package com.shiro.vo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class UserVo {
  9. //用户id
  10. private Integer id;
  11. //用户名称
  12. private String username;
  13. //用户密码
  14. private String password;
  15. }

com\shiro\vo\RoleVo.java

  1. package com.shiro.vo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.util.Date;
  6. @Data
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. public class RoleVo {
  10. //角色id
  11. private Integer id;
  12. //角色名称
  13. private String roleName;
  14. //创建时间
  15. private Date createTime;
  16. }

com\shiro\vo\PermissionVo.java

  1. package com.shiro.vo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.util.Date;
  6. @Data
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. public class PermissionVo {
  10. //权限id
  11. private Integer id;
  12. //权限名称
  13. private String permissionName;
  14. //创建时间
  15. private Date createTime;
  16. }

4:构建mapper接口以及配置文件

查询用户mapper:com\shiro\mapper\UserMapper.java

  1. package com.shiro.mapper;
  2. import com.shiro.vo.UserVo;
  3. import org.apache.ibatis.annotations.Param;
  4. public interface UserMapper {
  5. //通过用户名查询用户信息
  6. public UserVo queryUserByUsername(@Param("username") String username);
  7. }

查询用户配置文件:com\shiro\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 namespace="com.shiro.mapper.UserMapper">
  6. <select id="queryUserByUsername" parameterType="string" resultType="UserVo">
  7. select * from t_user where username = #{username}
  8. </select>
  9. </mapper>

查询角色mapper:com\shiro\mapper\RoleMapper.java

  1. package com.shiro.mapper;
  2. import org.apache.ibatis.annotations.Param;
  3. import java.util.Set;
  4. public interface RoleMapper {
  5. //通过用户名查询角色
  6. public Set<String> queryAllRoleNameByUsername(@Param("username") String username);
  7. }

查询角色配置文件:com\shiro\mapper\RoleMapper.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 namespace="com.shiro.mapper.RoleMapper">
  6. <select id="queryAllRoleNameByUsername" parameterType="string" resultType="string">
  7. SELECT t_role.role_name FROM t_user
  8. INNER JOIN t_user_role on t_user.id = t_user_role.user_id
  9. INNER JOIN t_role on t_role.id = t_user_role.role_id
  10. where t_user.username = #{username}
  11. </select>
  12. </mapper>

查询权限mapper:com\shiro\mapper\PermissionMapper.java

  1. package com.shiro.mapper;
  2. import org.apache.ibatis.annotations.Param;
  3. import java.util.Set;
  4. public interface PermissionMapper {
  5. //通过用户名查询权限
  6. public Set<String> queryAllPermissionByUsername(@Param("username") String username);
  7. }

查询权限配置文件:com\shiro\mapper\PermissionMapper.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 namespace="com.shiro.mapper.PermissionMapper">
  6. <select id="queryAllPermissionByUsername" parameterType="string" resultType="string">
  7. SELECT DISTINCT t_permission.permission_name FROM t_user
  8. INNER JOIN t_user_role on t_user.id = t_user_role.user_id
  9. INNER JOIN t_role on t_role.id = t_user_role.role_id
  10. INNER JOIN t_role_permission on t_role_permission.role_id = t_role.id
  11. INNER JOIN t_permission on t_permission.id = t_role_permission.permission_id
  12. where t_user.username = #{username}
  13. </select>
  14. </mapper>

5:构建数据库连接文件

resources\jdbc.properties

  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://ip:3306/my_test?useUnicode=true&characterEncoding=utf8
  3. jdbc.username=root
  4. jdbc.password=xxxxxxx

6:构建mybatis配置文件

resources\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. <settings>
  7. <!--打印sql语句-->
  8. <setting name="logImpl" value="STDOUT_LOGGING" />
  9. <!-- 全局性设置懒加载 -->
  10. <setting name="lazyLoadingEnabled" value="true"/>
  11. <!-- 每个属性都按需加载 -->
  12. <setting name="aggressiveLazyLoading" value="false"/>
  13. <!-- 开启驼峰命名 -->
  14. <setting name="mapUnderscoreToCamelCase" value="true" />
  15. </settings>
  16. <!--开启别名-->
  17. <typeAliases>
  18. <package name="com.shiro.vo" />
  19. </typeAliases>
  20. <!--mapper文件-->
  21. <mappers>
  22. <mapper resource="com/shiro/mapper/UserMapper.xml" />
  23. <mapper resource="com/shiro/mapper/RoleMapper.xml" />
  24. <mapper resource="com/shiro/mapper/PermissionMapper.xml" />
  25. </mappers>
  26. </configuration>

7:构建dao层配置文件

resources\spring-mapper.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. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. https://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!--加载jdbc配置文件-->
  7. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  8. <property name="locations">
  9. <list>
  10. <value>classpath:jdbc.properties</value>
  11. </list>
  12. </property>
  13. </bean>
  14. <!--数据源配置 数据源提供者包括:spring、c3p0、dbcp、druid-->
  15. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  16. <property name="driverClassName" value="${jdbc.driver}"></property>
  17. <property name="url" value="${jdbc.url}"></property>
  18. <property name="username" value="${jdbc.username}"></property>
  19. <property name="password" value="${jdbc.password}"></property>
  20. </bean>
  21. <!--配置得到SqlSessionFactory-->
  22. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  23. <property name="dataSource" ref="dataSource"></property>
  24. <!--绑定mybatis配置文件-->
  25. <property name="configLocation" value="classpath:mybatis-config.xml"></property>
  26. </bean>
  27. <!--通过MapperScannerConfigurer配置dao接口扫描包 实现动态注入到spring容器中-->
  28. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  29. <!--注入sqlSessionFactory-->
  30. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
  31. <!--要扫描的dao包-->
  32. <property name="basePackage" value="com.shiro.mapper" />
  33. </bean>
  34. </beans>

8:构建service接口以及实现类

接口:com\shiro\service\UserService.java

  1. package com.shiro.service;
  2. import com.shiro.vo.UserVo;
  3. import java.util.Set;
  4. public interface UserService {
  5. /*查询用户*/
  6. public UserVo queryUserByUsername(String username);
  7. /*查询角色*/
  8. public Set<String> queryAllRoleNameByUsername(String username);
  9. /*查询权限*/
  10. public Set<String> queryAllPermissionByUsername(String username);
  11. }

实现类:com\shiro\service\impl\UserServiceImpl.java

  1. package com.shiro.service.impl;
  2. import com.shiro.mapper.PermissionMapper;
  3. import com.shiro.mapper.RoleMapper;
  4. import com.shiro.mapper.UserMapper;
  5. import com.shiro.service.UserService;
  6. import com.shiro.vo.UserVo;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Service;
  9. import java.util.Set;
  10. @Service
  11. public class UserServiceImpl implements UserService {
  12. @Autowired
  13. UserMapper userMapper;
  14. @Autowired
  15. RoleMapper roleMapper;
  16. @Autowired
  17. PermissionMapper permissionMapper;
  18. public UserVo queryUserByUsername(String username) {
  19. return this.userMapper.queryUserByUsername(username);
  20. }
  21. public Set<String> queryAllRoleNameByUsername(String username) {
  22. return this.roleMapper.queryAllRoleNameByUsername(username);
  23. }
  24. public Set<String> queryAllPermissionByUsername(String username) {
  25. return permissionMapper.queryAllPermissionByUsername(username);
  26. }
  27. }

9:构建service层配置文件

resources\spring-service.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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. https://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. https://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/tx
  11. http://www.springframework.org/schema/tx/spring-tx.xsd
  12. http://www.springframework.org/schema/aop
  13. https://www.springframework.org/schema/aop/spring-aop.xsd">
  14. <!--注解版扫描包,这个包下面的注解就会生效-->
  15. <context:component-scan base-package="com.shiro.service" />
  16. <!--配置事务管理器-->
  17. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  18. <property name="dataSource" ref="dataSource"></property>
  19. </bean>
  20. <!--配置事务通知-->
  21. <tx:advice id="txAdvice" transaction-manager="transactionManager">
  22. <!--给哪些方法配置事务-->
  23. <tx:attributes>
  24. <tx:method name="*" propagation="REQUIRED"/>
  25. </tx:attributes>
  26. </tx:advice>
  27. <!--配置事务切入-->
  28. <aop:config>
  29. <aop:pointcut id="txpoint" expression="execution(* com.shiro.mapper.*.*(..))"></aop:pointcut>
  30. <aop:advisor advice-ref="txAdvice" pointcut-ref="txpoint"></aop:advisor>
  31. </aop:config>
  32. </beans>

10:构建controller控制类

com\shiro\controller\LoginController.java

  1. package com.shiro.controller;
  2. import com.shiro.vo.UserVo;
  3. import org.apache.shiro.SecurityUtils;
  4. import org.apache.shiro.authc.UsernamePasswordToken;
  5. import org.apache.shiro.subject.Subject;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.PostMapping;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. @Controller
  11. @RequestMapping("/user")
  12. public class LoginController {
  13. /*跳转登录界面*/
  14. @GetMapping("/login")
  15. public String login(){
  16. System.out.println("goto login page");
  17. return "login";
  18. }
  19. /*登录请求*/
  20. @PostMapping("/login")
  21. public String loginLogic(UserVo userVo){
  22. System.out.println("login logic");
  23. //获取subject
  24. Subject subject = SecurityUtils.getSubject();
  25. //获取令牌
  26. UsernamePasswordToken token = new UsernamePasswordToken(userVo.getUsername(), userVo.getPassword());
  27. //自动调用自定义的realm进行身份认证
  28. subject.login(token);
  29. System.out.println("登录状态为:" + subject.getPrincipal());
  30. return "login"; //登录成功
  31. }
  32. /*无权限页面,通过shiro.ini进行跳转*/
  33. @GetMapping("/error")
  34. public String userError(){
  35. System.out.println("没有权限访问的跳转页面");
  36. return "user_error";
  37. }
  38. }

11:构建controller层配置文件

resources\springmvc-servlet.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:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. https://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. https://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
  13. <context:component-scan base-package="com.shiro.controller"/>
  14. <!-- 让Spring MVC不处理静态资源 -->
  15. <mvc:default-servlet-handler />
  16. <!--annotation-driven配置帮助我们完成处理器映射器和处理器适配器-->
  17. <mvc:annotation-driven />
  18. <!--视图解析器:DispatcherServlet给他的ModelAndView-->
  19. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  20. <!--前缀-->
  21. <property name="prefix" value="/WEB-INF/jsp/"/>
  22. <!--后缀-->
  23. <property name="suffix" value=".jsp"/>
  24. </bean>
  25. </beans>

12:构建Spring总配置文件

resources\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. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <import resource="spring-mapper.xml"/>
  6. <import resource="spring-service.xml"/>
  7. <import resource="springmvc-servlet.xml"/>
  8. </beans>

13:构建自定义shiro的Realm

com\shiro\realm\MyRealm.java

  1. package com.shiro.realm;
  2. import com.shiro.service.UserService;
  3. import com.shiro.vo.UserVo;
  4. import org.apache.shiro.authc.AuthenticationException;
  5. import org.apache.shiro.authc.AuthenticationInfo;
  6. import org.apache.shiro.authc.AuthenticationToken;
  7. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  8. import org.apache.shiro.authz.AuthorizationInfo;
  9. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  10. import org.apache.shiro.realm.AuthorizingRealm;
  11. import org.apache.shiro.subject.PrincipalCollection;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.web.context.ContextLoader;
  14. import java.util.Set;
  15. @Component
  16. /*自定义realm*/
  17. public class MyRealm extends AuthorizingRealm {
  18. /*查询权限信息
  19. * 触发:请求触发:/user/query = roles["admin"]
  20. * /user/insert = perms["user:insert"] <shiro:hasRole <shiro:hasPermission
  21. * 查询方式:通过用户名查询角色 权限信息
  22. * */
  23. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
  24. //获取用户登录时发送过来的用户名
  25. String username = principalCollection.getPrimaryPrincipal().toString();
  26. //查询用户权限(DB)
  27. UserService userServiceImpl = ContextLoader.getCurrentWebApplicationContext().getBean("userServiceImpl", UserService.class);
  28. Set<String> roles = userServiceImpl.queryAllRoleNameByUsername(username);
  29. Set<String> perms = userServiceImpl.queryAllPermissionByUsername(username);
  30. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
  31. info.setStringPermissions(perms);
  32. return info;
  33. }
  34. /*查询身份信息
  35. * 触发:subject.login(token)
  36. * */
  37. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  38. //获取用户登录时发送过来的用户名
  39. String username = token.getPrincipal().toString();
  40. //查询用户信息(DB)
  41. UserService userServiceImpl = ContextLoader.getCurrentWebApplicationContext().getBean("userServiceImpl", UserService.class);
  42. UserVo userVo = userServiceImpl.queryUserByUsername(username);
  43. if(userVo==null){
  44. return null;
  45. }
  46. return new SimpleAuthenticationInfo(userVo.getUsername(), userVo.getPassword(),this.getName());
  47. }
  48. }

14:构建shiro配置文件

resources\shiro.ini

  1. [main]
  2. #没有身份认证时的跳转地址(自定义)
  3. shiro.loginUrl= /user/login
  4. #角色权限校验不通过时的跳转地址
  5. shiro.unauthorizedUrl = /user/error
  6. #登出后的跳转地址
  7. shiro.redirectUrl = /user/login
  8. #声明自定义realm
  9. realm = com.shiro.realm.MyRealm
  10. #注册安装自定义realm
  11. securityManager.realms=$realm
  12. [urls]
  13. #不拦截
  14. /user/login = anon
  15. /getuser = anon
  16. /getrole = anon
  17. #删除用户 要登录而且角色必须是管理员和经理
  18. /user/delUser = authc,roles["admin","manager"]
  19. #查询用户 要登录而且必须有user:query的权限
  20. /user/getallUsers = authc
  21. #登出
  22. /user/logout = logout

15:配置web.xml配置spring及shiro加载项

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <!--
  7. 在启动时初始化shiro环境 将securityManager托管到SecurityUtils工具类中
  8. -->
  9. <filter>
  10. <filter-name>shiroFilter</filter-name>
  11. <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>shiroFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>
  17. <!--加载shiro.ini默认配置-->
  18. <listener>
  19. <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
  20. </listener>
  21. <!--1.注册DispatcherServlet-->
  22. <servlet>
  23. <servlet-name>springmvc</servlet-name>
  24. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  25. <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
  26. <init-param>
  27. <param-name>contextConfigLocation</param-name>
  28. <param-value>classpath:applicationContext.xml</param-value>
  29. </init-param>
  30. <!--启动级别-1-->
  31. <load-on-startup>1</load-on-startup>
  32. </servlet>
  33. <!--/ 匹配所有的请求;(不包括.jsp)-->
  34. <!--/* 匹配所有的请求;(包括.jsp)-->
  35. <servlet-mapping>
  36. <servlet-name>springmvc</servlet-name>
  37. <url-pattern>/</url-pattern>
  38. </servlet-mapping>
  39. <!--启动Web容器时,初始化spring配置,可以让自定义realm拿到bean-->
  40. <listener>
  41. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  42. </listener>
  43. <context-param>
  44. <param-name>contextConfigLocation</param-name>
  45. <param-value>classpath:applicationContext.xml</param-value>
  46. </context-param>
  47. </web-app>

16:构建相关界面

WEB-INF\jsp\login.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
  3. <html>
  4. <head>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <shiro:guest>
  9. 欢迎您 游客~~~
  10. </shiro:guest>
  11. <br />
  12. <shiro:notAuthenticated>
  13. 请登录:
  14. <form action="/user/login" method="post">
  15. username:<input type="text" name="username"><br />
  16. password:<input type="text" name="password"><br />
  17. <button type="submit">登录</button>
  18. </form>
  19. </shiro:notAuthenticated>
  20. <br />
  21. <shiro:authenticated>
  22. 你已经登录 欢迎你:<shiro:principal /> <a href="/user/logout">退出</a>
  23. <br />
  24. <%--角色是banzhang或者student--%>
  25. <shiro:hasAnyRoles name="banzhang,student">
  26. 都要学习【songsong、yuanhang】
  27. </shiro:hasAnyRoles>
  28. <br />
  29. <%--角色是student的--%>
  30. <shiro:hasRole name="student">
  31. 我是学生【songsong、yuanhang】
  32. </shiro:hasRole>
  33. <br />
  34. <%--角色不是banzhang的--%>
  35. <shiro:lacksRole name="banzhang">
  36. 我不是班长【yuanhang】
  37. </shiro:lacksRole>
  38. <br />
  39. <%--角色是banzhang的--%>
  40. <shiro:hasRole name="banzhang">
  41. 我是班长【songsong】
  42. </shiro:hasRole>
  43. <br />
  44. <%--权限包含student:yq--%>
  45. <shiro:hasPermission name="student:yq">
  46. 我有收钱的权限【songsong】
  47. </shiro:hasPermission>
  48. <br />
  49. <%--权限不包含student:yq的--%>
  50. <shiro:lacksPermission name="student:yq">
  51. 我没有收钱的权限【yuanhang】
  52. </shiro:lacksPermission>
  53. </shiro:authenticated>
  54. </body>
  55. </html>

WEB-INF\jsp\user_error.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. 权限不足
  8. </body>
  9. </html>

17:访问测试

shiro:自定义remle(二)的更多相关文章

  1. Shiro笔记(二)身份验证

    Shiro笔记(二)身份验证 一.核心代码 @Test public void helloWorldTest(){ IniSecurityManagerFactory factory = new In ...

  2. Shiro 自定义登陆、授权、拦截器

    Shiro 登陆.授权.拦截 按钮权限控制 一.目标 Maven+Spring+shiro 自定义登陆.授权 自定义拦截器 加载数据库资源构建拦截链 使用总结: 1.需要设计的数据库:用户.角色.权限 ...

  3. 解决shiro自定义filter后,ajax登录无法登录,并且无法显示静态资源的问题

    这个问题困扰了我一天,看了下面两个文章,豁然开朗: https://www.cnblogs.com/gj1990/p/8057348.html https://412887952-qq-com.ite ...

  4. Android自定义视图二:如何绘制内容

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  5. PHP自定义生成二维码跳转地址

      比较简单的一款PHP自定义生成二维码跳转地址,手机端微信扫码,自动跳转到定义好的链接.支持自定义生成二维码尺寸.间距等.    鼠标悬浮显示二维码弹出层,离开后消失.js实现,代码如下: $(fu ...

  6. vue2.0 自定义 生成二维码(QRCode)组件

    1.自定义 生成二维码组件 QRCode.vue <!-- 生成二维码 组件 --> <template> <canvas class="qrcode-canv ...

  7. Apcahe Shiro学习笔记(二):通过JDBC进行权限控制

    一.概述: 官方对Realm(领域)的描述:https://www.infoq.com/articles/apache-shiro 其功能本质上是一个安全特定的DAO,用于链接数据持久层(任何形式的都 ...

  8. shiro基础学习(二)—shiro认证

    一.shiro简介      shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证.权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. 以下 ...

  9. Shiro自定义realm实现密码验证及登录、密码加密注册、修改密码的验证

    一:先从登录开始,直接看代码 @RequestMapping(value="dologin",method = {RequestMethod.GET, RequestMethod. ...

随机推荐

  1. 使用Keras进行深度学习:(三)使用text-CNN处理自然语言(上)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 上一篇文章中一直围绕着CNN处理图像数据进行讲解,而CNN除了处理 ...

  2. nginx IF 指令

    变量名可以使用"="或"!="运算符 ~ 符号表示区分大小写字母的匹配 "~*"符号表示不区分大小写字母的匹配 "!"和 ...

  3. iOS 缩小 ipa 大小

    一.爱奇艺 爱奇艺移动应用优化之路:如何让崩溃率小于千分之二 iOS8 对于 App 的 text 段有 60MB 的限制: 超过 200MB 的 App 需要连接 WIFI 下载(之前是 150MB ...

  4. [斯坦福大学2014机器学习教程笔记]第五章-控制语句:for,while,if语句

    在本节中,我们将学习如何为Octave程序写控制语句. 首先,我们先学习如何使用for循环.我们将v设为一个10行1列的零向量. 接着,我们写一个for循环,让i等于1到10.写出来就是for i = ...

  5. Validation框架的应用

    Validation框架的应用 一,前言 这篇博客只说一下Validation框架的应用,不涉及相关JSR,相关理论,以及源码的解析. 如果之后需要的话,会再开博客描写,这样会显得主题突出一些. 后续 ...

  6. python编程心得(1)

    1.创建字典     字典名 = {键名1:键值1,键名2:键值2,...}     sanguo = {"诸葛亮草船借箭":"满载而归","关公赴会 ...

  7. LeetCode | 136. 只出现一次的数字Ⅰ Ⅱ

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  8. web font各浏览器兼容问题以及格式

    语法: @font-face { font-family: <identifier>; src: <fontsrc> [, <fontsrc>]*; <fon ...

  9. cephfs分布式系统

                                                               cephfs分布式系统 CephFS:分布式文件系统 l 什么是CephFS: 分 ...

  10. Linux基础管理篇,软件管理程序,yum与rpm

    一.RPM 一般来说,rpm类型的文件在安装的时候,会检测当前的系统是否满足当前软件需要的环境.若符合,则该软件就会被安装,并且会把软件的相关信息写入/var/lib/rpm/目录下的数据库文件中. ...