SpringBoot整合Shiro权限框架

本文详细介绍如何使用Shiro权限框架实现用户登录与权限验证,包括数据库脚本创建、Springboot集成Shiro依赖、实体类设计、MyBatis持久层配置、Shiro工具类编写、控制器与视图层实现,以及Shiro标签的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转自:https://blog.youkuaiyun.com/sujin_/article/details/80558287

Shiro是一个非常不错的权限框架,它提供了登录和权限验证功能,如果想去了解它的话可以去Shiro官网学习  点击打开

1.创建数据库脚本


 
  1. SET NAMES utf8mb4;
  2. SET FOREIGN_KEY_CHECKS = 0;
  3. -- ----------------------------
  4. -- Table structure for module
  5. -- ----------------------------
  6. DROP TABLE IF EXISTS `module`;
  7. CREATE TABLE `module` (
  8. `mid` int( 11) NOT NULL AUTO_INCREMENT,
  9. `mname` varchar( 255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  10. PRIMARY KEY ( `mid`) USING BTREE
  11. ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
  12. -- ----------------------------
  13. -- Records of module
  14. -- ----------------------------
  15. INSERT INTO `module` VALUES ( 1, 'add');
  16. INSERT INTO `module` VALUES ( 2, 'delete');
  17. INSERT INTO `module` VALUES ( 3, 'query');
  18. INSERT INTO `module` VALUES ( 4, 'update');
  19. -- ----------------------------
  20. -- Table structure for module_role
  21. -- ----------------------------
  22. DROP TABLE IF EXISTS `module_role`;
  23. CREATE TABLE `module_role` (
  24. `rid` int( 11) NULL DEFAULT NULL,
  25. `mid` int( 11) NULL DEFAULT NULL,
  26. INDEX `rid`( `rid`) USING BTREE,
  27. INDEX `mid`( `mid`) USING BTREE,
  28. CONSTRAINT `mid` FOREIGN KEY ( `mid`) REFERENCES `module` ( `mid`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  29. CONSTRAINT `rid` FOREIGN KEY ( `rid`) REFERENCES `role` ( `rid`) ON DELETE RESTRICT ON UPDATE RESTRICT
  30. ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
  31. -- ----------------------------
  32. -- Records of module_role
  33. -- ----------------------------
  34. INSERT INTO `module_role` VALUES ( 1, 1);
  35. INSERT INTO `module_role` VALUES ( 1, 2);
  36. INSERT INTO `module_role` VALUES ( 1, 3);
  37. INSERT INTO `module_role` VALUES ( 1, 4);
  38. INSERT INTO `module_role` VALUES ( 2, 1);
  39. INSERT INTO `module_role` VALUES ( 2, 3);
  40. -- ----------------------------
  41. -- Table structure for role
  42. -- ----------------------------
  43. DROP TABLE IF EXISTS `role`;
  44. CREATE TABLE `role` (
  45. `rid` int( 11) NOT NULL AUTO_INCREMENT,
  46. `rname` varchar( 255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  47. PRIMARY KEY ( `rid`) USING BTREE
  48. ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
  49. -- ----------------------------
  50. -- Records of role
  51. -- ----------------------------
  52. INSERT INTO `role` VALUES ( 1, 'admin');
  53. INSERT INTO `role` VALUES ( 2, 'customer');
  54. INSERT INTO `role` VALUES ( 3, NULL);
  55. -- ----------------------------
  56. -- Table structure for user
  57. -- ----------------------------
  58. DROP TABLE IF EXISTS `user`;
  59. CREATE TABLE `user` (
  60. `uid` int( 11) NOT NULL AUTO_INCREMENT,
  61. `username` varchar( 255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  62. `password` varchar( 255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  63. PRIMARY KEY ( `uid`) USING BTREE
  64. ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
  65. -- ----------------------------
  66. -- Records of user
  67. -- ----------------------------
  68. INSERT INTO `user` VALUES ( 1, 'hlhdidi', '123');
  69. INSERT INTO `user` VALUES ( 2, 'xyycici', '1992');
  70. INSERT INTO `user` VALUES ( 3, 'sujin', '123');
  71. -- ----------------------------
  72. -- Table structure for user_role
  73. -- ----------------------------
  74. DROP TABLE IF EXISTS `user_role`;
  75. CREATE TABLE `user_role` (
  76. `uid` int( 11) NULL DEFAULT NULL,
  77. `rid` int( 11) NULL DEFAULT NULL,
  78. INDEX `u_fk`( `uid`) USING BTREE,
  79. INDEX `r_fk`( `rid`) USING BTREE,
  80. CONSTRAINT `r_fk` FOREIGN KEY ( `rid`) REFERENCES `role` ( `rid`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  81. CONSTRAINT `u_fk` FOREIGN KEY ( `uid`) REFERENCES `user` ( `uid`) ON DELETE RESTRICT ON UPDATE RESTRICT
  82. ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
  83. -- ----------------------------
  84. -- Records of user_role
  85. -- ----------------------------
  86. INSERT INTO `user_role` VALUES ( 1, 1);
  87. INSERT INTO `user_role` VALUES ( 2, 2);
  88. INSERT INTO `user_role` VALUES ( 3, 3);
  89. SET FOREIGN_KEY_CHECKS = 1;

当新添加一个用户时,只需要配置权限即可,module_role表中已经配置了什么权限拥有什么样的功能


 
  1. SELECT u.*,r.*,m.* FROM user u inner join user_role ur on ur.uid=u.uid
  2. inner join role r on r.rid=ur.rid
  3. inner join module_role mr on mr.rid=r.rid
  4. inner join module m on mr.mid=m.mid
  5. WHERE username= 'hlhdidi'; -- xyycici用户已分配只要两个权限 add和query

2.pom.xml中添加Springboot集成shiro的相关依赖


 
  1. <!-- shiro整合springboot所需相关依赖-->
  2. <dependency>
  3. <groupId>org.apache.shiro </groupId>
  4. <artifactId>shiro-spring </artifactId>
  5. <version>1.2.5 </version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.shiro </groupId>
  9. <artifactId>shiro-ehcache </artifactId>
  10. <version>1.2.5 </version>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.github.theborakompanioni </groupId>
  14. <artifactId>thymeleaf-extras-shiro </artifactId>
  15. <version>1.2.1 </version>
  16. </dependency>
  17. <!--end.......-->

3.创建实体类

仅列出关键实体类,其他实体类无需改动

用户 


 
  1. package com.king.s5.model;
  2. import java.io.Serializable;
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. //用户
  6. public class User implements Serializable{
  7. private Integer uid;
  8. private String username;
  9. private String password;
  10. private Set<Role> roles = new HashSet<>();
  11. public User(Integer uid, String username, String password) {
  12. this.uid = uid;
  13. this.username = username;
  14. this.password = password;
  15. }
  16. public User() {
  17. super();
  18. }
  19. public Integer getUid() {
  20. return uid;
  21. }
  22. public void setUid(Integer uid) {
  23. this.uid = uid;
  24. }
  25. public String getUsername() {
  26. return username;
  27. }
  28. public void setUsername(String username) {
  29. this.username = username;
  30. }
  31. public String getPassword() {
  32. return password;
  33. }
  34. public void setPassword(String password) {
  35. this.password = password;
  36. }
  37. public Set<Role> getRoles() {
  38. return roles;
  39. }
  40. public void setRoles(Set<Role> roles) {
  41. this.roles = roles;
  42. }
  43. }

功能 


 
  1. package com.king.s5.model;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. //功能
  5. public class Module {
  6. private Integer mid;
  7. private String mname;
  8. private Set<Role> roles;
  9. public Module(Integer mid, String mname) {
  10. this.mid = mid;
  11. this.mname = mname;
  12. }
  13. public Module() {
  14. super();
  15. }
  16. public Integer getMid() {
  17. return mid;
  18. }
  19. public void setMid(Integer mid) {
  20. this.mid = mid;
  21. }
  22. public String getMname() {
  23. return mname;
  24. }
  25. public void setMname(String mname) {
  26. this.mname = mname;
  27. }
  28. public Set<Role> getRoles() {
  29. return roles;
  30. }
  31. public void setRoles(Set<Role> roles) {
  32. this.roles = roles;
  33. }
  34. }

权限


 
  1. public class Role {
  2. private Integer rid;
  3. private String rname;
  4. private Set<User> users = new HashSet<>();
  5. private Set<Module> Modules = new HashSet<>();
  6. public Role(Integer rid, String rname) {
  7. this.rid = rid;
  8. this.rname = rname;
  9. }
  10. public Role() {
  11. super();
  12. }
  13. public Integer getRid() {
  14. return rid;
  15. }
  16. public void setRid(Integer rid) {
  17. this.rid = rid;
  18. }
  19. public String getRname() {
  20. return rname;
  21. }
  22. public void setRname(String rname) {
  23. this.rname = rname;
  24. }
  25. public Set<User> getUsers() {
  26. return users;
  27. }
  28. public void setUsers(Set<User> users) {
  29. this.users = users;
  30. }
  31. public Set<Module> getModules() {
  32. return Modules;
  33. }
  34. public void setModules(Set<Module> modules) {
  35. Modules = modules;
  36. }
  37. }

4.编写持久层mapper.xml 

userMapper.xml,本次只写到mapper层,不做service层(仅列出关键mapper.xml),其他xml无需改变


 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.king.s5.mapper.UserMapper" >
  4. <resultMap id="BaseResultMap" type="com.king.s5.model.User" >
  5. <constructor >
  6. <idArg column="uid" jdbcType="INTEGER" javaType="java.lang.Integer" />
  7. <arg column="username" jdbcType="VARCHAR" javaType="java.lang.String" />
  8. <arg column="password" jdbcType="VARCHAR" javaType="java.lang.String" />
  9. </constructor>
  10. </resultMap>
  11. <resultMap type="com.king.s5.model.User" id="userMap">
  12. <id property="uid" column="uid"/>
  13. <result property="username" column="username"/>
  14. <result property="password" column="password"/>
  15. <collection property="roles" ofType="com.king.s5.model.Role">
  16. <id property="rid" column="rid"/>
  17. <result property="rname" column="rname"/>
  18. <collection property="modules" ofType="com.king.s5.model.Module">
  19. <id property="mid" column="mid"/>
  20. <result property="mname" column="mname"/>
  21. </collection>
  22. </collection>
  23. </resultMap>
  24. <sql id="Base_Column_List" >
  25. uid, username, password
  26. </sql>
  27. <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
  28. select
  29. <include refid="Base_Column_List" />
  30. from user
  31. where uid = #{uid,jdbcType=INTEGER}
  32. </select>
  33. <select id="queryUserName" parameterType="string" resultMap="userMap">
  34. SELECT u.*,r.*,m.* FROM user u inner join user_role ur on ur.uid=u.uid
  35. inner join role r on r.rid=ur.rid
  36. inner join module_role mr on mr.rid=r.rid
  37. inner join module m on mr.mid=m.mid
  38. WHERE username=#{username};
  39. </select>
  40. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
  41. delete from user
  42. where uid = #{uid,jdbcType=INTEGER}
  43. </delete>
  44. <insert id="insert" parameterType="com.king.s5.model.User" >
  45. insert into user (uid, username, password
  46. )
  47. values (#{uid,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}
  48. )
  49. </insert>
  50. <insert id="insertSelective" parameterType="com.king.s5.model.User" >
  51. insert into user
  52. <trim prefix="(" suffix=")" suffixOverrides="," >
  53. <if test="uid != null" >
  54. uid,
  55. </if>
  56. <if test="username != null" >
  57. username,
  58. </if>
  59. <if test="password != null" >
  60. password,
  61. </if>
  62. </trim>
  63. <trim prefix="values (" suffix=")" suffixOverrides="," >
  64. <if test="uid != null" >
  65. #{uid,jdbcType=INTEGER},
  66. </if>
  67. <if test="username != null" >
  68. #{username,jdbcType=VARCHAR},
  69. </if>
  70. <if test="password != null" >
  71. #{password,jdbcType=VARCHAR},
  72. </if>
  73. </trim>
  74. </insert>
  75. <update id="updateByPrimaryKeySelective" parameterType="com.king.s5.model.User" >
  76. update user
  77. <set >
  78. <if test="username != null" >
  79. username = #{username,jdbcType=VARCHAR},
  80. </if>
  81. <if test="password != null" >
  82. password = #{password,jdbcType=VARCHAR},
  83. </if>
  84. </set>
  85. where uid = #{uid,jdbcType=INTEGER}
  86. </update>
  87. <update id="updateByPrimaryKey" parameterType="com.king.s5.model.User" >
  88. update user
  89. set username = #{username,jdbcType=VARCHAR},
  90. password = #{password,jdbcType=VARCHAR}
  91. where uid = #{uid,jdbcType=INTEGER}
  92. </update>
  93. </mapper>

moduleMapper.xml


 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.king.s5.mapper.ModuleMapper" >
  4. <resultMap id="BaseResultMap" type="com.king.s5.model.Module" >
  5. <constructor >
  6. <idArg column="mid" jdbcType="INTEGER" javaType="java.lang.Integer" />
  7. <arg column="mname" jdbcType="VARCHAR" javaType="java.lang.String" />
  8. </constructor>
  9. </resultMap>
  10. <sql id="Base_Column_List" >
  11. mid, mname
  12. </sql>
  13. <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
  14. select
  15. <include refid="Base_Column_List" />
  16. from module
  17. where mid = #{mid,jdbcType=INTEGER}
  18. </select>
  19. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
  20. delete from module
  21. where mid = #{mid,jdbcType=INTEGER}
  22. </delete>
  23. <insert id="insert" parameterType="com.king.s5.model.Module" >
  24. insert into module (mid, mname)
  25. values (#{mid,jdbcType=INTEGER}, #{mname,jdbcType=VARCHAR})
  26. </insert>
  27. <insert id="insertSelective" parameterType="com.king.s5.model.Module" >
  28. insert into module
  29. <trim prefix="(" suffix=")" suffixOverrides="," >
  30. <if test="mid != null" >
  31. mid,
  32. </if>
  33. <if test="mname != null" >
  34. mname,
  35. </if>
  36. </trim>
  37. <trim prefix="values (" suffix=")" suffixOverrides="," >
  38. <if test="mid != null" >
  39. #{mid,jdbcType=INTEGER},
  40. </if>
  41. <if test="mname != null" >
  42. #{mname,jdbcType=VARCHAR},
  43. </if>
  44. </trim>
  45. </insert>
  46. <update id="updateByPrimaryKeySelective" parameterType="com.king.s5.model.Module" >
  47. update module
  48. <set >
  49. <if test="mname != null" >
  50. mname = #{mname,jdbcType=VARCHAR},
  51. </if>
  52. </set>
  53. where mid = #{mid,jdbcType=INTEGER}
  54. </update>
  55. <update id="updateByPrimaryKey" parameterType="com.king.s5.model.Module" >
  56. update module
  57. set mname = #{mname,jdbcType=VARCHAR}
  58. where mid = #{mid,jdbcType=INTEGER}
  59. </update>
  60. </mapper>

5.添加shiro的工具类

认证授权工具类


 
  1. package com.king.s5.shiro;
  2. import com.king.s5.biz.IUserBiz;
  3. import com.king.s5.mapper.UserMapper;
  4. import com.king.s5.model.Module;
  5. import com.king.s5.model.Role;
  6. import com.king.s5.model.User;
  7. import org.apache.shiro.authc.*;
  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.beans.factory.annotation.Autowired;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. import java.util.Set;
  16. public class AuthRealm extends AuthorizingRealm {
  17. @Autowired
  18. private UserMapper userMapper;
  19. //认证.登录
  20. @Override
  21. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  22. UsernamePasswordToken utoken=(UsernamePasswordToken) token; //获取用户输入的token
  23. String username = utoken.getUsername();
  24. User user = userMapper.queryUserName(username);
  25. //放入shiro.调用CredentialsMatcher检验密码
  26. return new SimpleAuthenticationInfo(user, user.getPassword(), this.getClass().getName());
  27. }
  28. //授权
  29. @Override
  30. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
  31. //获取session中的用户
  32. User user=(User) principal.fromRealm( this.getClass().getName()).iterator().next();
  33. List<String> permissions= new ArrayList<>();
  34. Set<Role> roles = user.getRoles();
  35. if(roles.size()> 0) {
  36. for(Role role : roles) {
  37. Set<Module> modules = role.getModules();
  38. if(modules.size()> 0) {
  39. for(Module module : modules) {
  40. permissions.add( module.getMname());
  41. }
  42. }
  43. }
  44. }
  45. SimpleAuthorizationInfo info= new SimpleAuthorizationInfo();
  46. //将权限放入shiro中.
  47. info.addStringPermissions(permissions);
  48. return info;
  49. }
  50. }

权限用户密码校验类


 
  1. package com.king.s5.shiro;
  2. import org.apache.shiro.authc.AuthenticationInfo;
  3. import org.apache.shiro.authc.AuthenticationToken;
  4. import org.apache.shiro.authc.UsernamePasswordToken;
  5. import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;
  6. public class CredentialsMatcher extends SimpleCredentialsMatcher {
  7. //校验
  8. @Override
  9. public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
  10. UsernamePasswordToken utoken=(UsernamePasswordToken) token;
  11. //获得用户输入的密码:(可以采用加盐(salt)的方式去检验)
  12. String inPassword = new String(utoken.getPassword());
  13. //获得数据库中的密码
  14. String dbPassword=(String) info.getCredentials();
  15. //进行密码的比对
  16. return this.equals(inPassword, dbPassword);
  17. }
  18. }

shiro配置类


 
  1. package com.king.s5.shiro;
  2. import org.apache.shiro.spring.LifecycleBeanPostProcessor;
  3. import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
  4. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  5. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  6. import org.apache.shiro.mgt.SecurityManager;
  7. import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
  8. import org.springframework.beans.factory.annotation.Qualifier;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import java.util.LinkedHashMap;
  12. /**
  13. * shiro的配置类
  14. * @author sujin
  15. *
  16. */
  17. @Configuration
  18. public class ShiroConfiguration {
  19. @Bean(name= "shiroFilter")
  20. public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager manager) {
  21. ShiroFilterFactoryBean bean= new ShiroFilterFactoryBean();
  22. bean.setSecurityManager(manager);
  23. //配置登录的url和登录成功的url
  24. bean.setLoginUrl( "/login");
  25. bean.setSuccessUrl( "/home");
  26. //配置访问权限
  27. LinkedHashMap<String, String> filterChainDefinitionMap= new LinkedHashMap<>();
  28. filterChainDefinitionMap.put( "/login*", "anon"); //表示可以匿名访问
  29. filterChainDefinitionMap.put( "/loginUser", "anon");
  30. filterChainDefinitionMap.put( "/client/test", "anon");
  31. filterChainDefinitionMap.put( "/assert/test", "anon"); //添加白名单
  32. filterChainDefinitionMap.put( "/assert/get", "anon"); //添加白名单
  33. filterChainDefinitionMap.put( "/assert/assertQuery", "anon"); //添加白名单
  34. filterChainDefinitionMap.put( "/a", "anon");
  35. filterChainDefinitionMap.put( "/book/list", "anon");
  36. filterChainDefinitionMap.put( "/logout*", "anon");
  37. filterChainDefinitionMap.put( "/jsp/error.jsp*", "anon");
  38. filterChainDefinitionMap.put( "/jsp/login.jsp*", "authc");
  39. filterChainDefinitionMap.put( "/*", "authc"); //表示需要认证才可以访问
  40. filterChainDefinitionMap.put( "/**", "authc"); //表示需要认证才可以访问
  41. filterChainDefinitionMap.put( "/*.*", "authc");
  42. bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
  43. return bean;
  44. }
  45. //配置核心安全事务管理器
  46. @Bean(name= "securityManager")
  47. public SecurityManager securityManager(@Qualifier("authRealm") AuthRealm authRealm) {
  48. System.err.println( "--------------shiro已经加载----------------");
  49. DefaultWebSecurityManager manager= new DefaultWebSecurityManager();
  50. manager.setRealm(authRealm);
  51. return manager;
  52. }
  53. //配置自定义的权限登录器
  54. @Bean(name= "authRealm")
  55. public AuthRealm authRealm(@Qualifier("credentialsMatcher") CredentialsMatcher matcher) {
  56. AuthRealm authRealm= new AuthRealm();
  57. authRealm.setCredentialsMatcher(matcher);
  58. return authRealm;
  59. }
  60. //配置自定义的密码比较器
  61. @Bean(name= "credentialsMatcher")
  62. public CredentialsMatcher credentialsMatcher() {
  63. return new CredentialsMatcher();
  64. }
  65. @Bean
  66. public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){
  67. return new LifecycleBeanPostProcessor();
  68. }
  69. @Bean
  70. public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){
  71. DefaultAdvisorAutoProxyCreator creator= new DefaultAdvisorAutoProxyCreator();
  72. creator.setProxyTargetClass( true);
  73. return creator;
  74. }
  75. @Bean
  76. public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") SecurityManager manager) {
  77. AuthorizationAttributeSourceAdvisor advisor= new AuthorizationAttributeSourceAdvisor();
  78. advisor.setSecurityManager(manager);
  79. return advisor;
  80. }
  81. }

6.控制层controller


 
  1. package com.king.s5.controller;
  2. import com.king.s5.model.User;
  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.RequestMapping;
  8. import javax.servlet.http.HttpSession;
  9. @Controller
  10. public class LoginController {
  11. @RequestMapping( "/login")
  12. public String login() {
  13. return "login";
  14. }
  15. @RequestMapping( "/a")
  16. public String a() {
  17. return "a";
  18. }
  19. @RequestMapping( "/loginUser")
  20. public String loginUser(String username,String password,HttpSession session) {
  21. //授权认证
  22. UsernamePasswordToken usernamePasswordToken= new UsernamePasswordToken(username,password);
  23. Subject subject = SecurityUtils.getSubject();
  24. try {
  25. //完成登录
  26. subject.login(usernamePasswordToken);
  27. //获得用户对象
  28. User user=(User) subject.getPrincipal();
  29. //存入session
  30. session.setAttribute( "user", user);
  31. return "index";
  32. } catch(Exception e) {
  33. return "login"; //返回登录页面
  34. }
  35. }
  36. @RequestMapping( "/logOut")
  37. public String logOut(HttpSession session) {
  38. Subject subject = SecurityUtils.getSubject();
  39. subject.logout();
  40. // session.removeAttribute("user");
  41. return "login";
  42. }
  43. }

7.视图层jsp

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <title>登录</title>
</head>

<h1>欢迎登录!${user.username }</h1>
<form action="${pageContext.request.contextPath }/loginUser" method="post">
    <input type="text" name="username"><br>
    <input type="password" name="password"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <title>登录</title>
</head>

<h1>欢迎${user.username }光临!请选择你的操作:</h1><br>
<ul>
    <shiro:hasPermission name="add"><li>增加</li></shiro:hasPermission>
    <shiro:hasPermission name="delete"><li>删除</li></shiro:hasPermission>
    <shiro:hasPermission name="update"><li>修改</li></shiro:hasPermission>
    <shiro:hasPermission name="query"><li>查询</li></shiro:hasPermission>

</ul>
<a href="${pageContext.request.contextPath }/logOut">点我注销</a>
</body>
</html>

8.shiro标签的使用

guest标签 验证当前用户是否为“访客”,即未认证(包含未记住)的用户 
user标签认证通过或已记住的用户
authenticated标签已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在
notAuthenticated标签未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户
principal 标签输出当前用户信息,通常为登录帐号信息
hasRole标签验证当前用户是否属于该角色
lacksRole标签与hasRole标签逻辑相反,当用户不属于该角色时验证通过
hasAnyRole标签验证当前用户是否属于以下任意一个角色
hasPermission标签验证当前用户是否拥有指定权限
lacksPermission标签与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过

如果大家有什么问题,可以在下方留言,想要源码的可以到我的资源库下载    点击下载 

 

--------------如果大家喜欢我的博客,可以点击左上角的关注哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值