﻿{"id":1070,"date":"2023-04-24T22:11:17","date_gmt":"2023-04-24T14:11:17","guid":{"rendered":"http:\/\/blog.sway.com.cn\/?p=1070"},"modified":"2023-04-26T20:55:19","modified_gmt":"2023-04-26T12:55:19","slug":"springboot2-7-11%e6%95%b4%e5%90%88mybatisshiro","status":"publish","type":"post","link":"http:\/\/blog.sway.com.cn\/?p=1070","title":{"rendered":"SpringBoot2.7.11\u6574\u5408MyBatis+Shiro"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u5f15\u5165Shiro\u4f9d\u8d56<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">        &lt;!--shiro\u6743\u9650\u6846\u67b6-->\n        &lt;dependency>\n            &lt;groupId>org.apache.shiro&lt;\/groupId>\n            &lt;artifactId>shiro-spring&lt;\/artifactId>\n            &lt;version>1.4.0&lt;\/version>\n        &lt;\/dependency><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u521b\u5efapojo\u5b9e\u4f53\u7c7b<\/h2>\n\n\n\n<p>Account.java\uff08\u8d26\u53f7\uff09<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package cn.com.sway.doctor.service.common.model;\n\nimport lombok.Data;\n\n@Data\npublic class Account {\n\n    private String id;\n    private String mobile;\n    private String password;\n    private String name;\n\n}\n<\/pre>\n\n\n\n<p>Role.java\uff08\u89d2\u8272\uff09<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package cn.com.sway.doctor.service.common.model;\n\npublic class Role {\n\n    private String id;\n    private String name;\n\n}\n<\/pre>\n\n\n\n<p>Permission.java\uff08\u6743\u9650\uff09<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package cn.com.sway.doctor.service.common.model;\n\npublic class Permission {\n\n    private String id;\n    private String name;\n\n}\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u521b\u5efaMapper<\/h2>\n\n\n\n<p>AuthMapper.java<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package cn.com.sway.doctor.service.user.mapper;\n\nimport cn.com.sway.doctor.service.common.model.Account;\nimport org.apache.ibatis.annotations.Mapper;\n\nimport java.util.List;\nimport java.util.Map;\n\n@Mapper\npublic interface AuthMapper {\n\n    Account getAccountByMobile(String mobile);\n\n    List&lt;Map&lt;String,Object>> getAccountPower(String mobile);\n\n}\n<\/pre>\n\n\n\n<p>AuthMapper.xml<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n&lt;!DOCTYPE mapper\n        PUBLIC \"-\/\/mybatis.org\/\/DTD Mapper 3.0\/\/EN\"\n        \"http:\/\/mybatis.org\/dtd\/mybatis-3-mapper.dtd\">\n&lt;mapper namespace=\"cn.com.sway.doctor.service.user.mapper.AuthMapper\">\n\n    &lt;!--\u901a\u8fc7\u624b\u673a\u53f7\u67e5\u627e\u7528\u6237\u4fe1\u606f-->\n    &lt;select id=\"getAccountByMobile\" resultType=\"cn.com.sway.doctor.service.common.model.Account\" parameterType=\"String\">\n        SELECT *\n        FROM account\n        WHERE mobile=#{mobile}\n    &lt;\/select>\n\n    &lt;!--\u901a\u8fc7\u624b\u673a\u53f7\u67e5\u627e\u7528\u6237\u6743\u9650\u4fe1\u606f-->\n    &lt;select id=\"getAccountPower\" resultType=\"java.util.HashMap\" parameterType=\"String\">\n        SELECT account.id, account.mobile, role.name AS role, permission.id AS permission\n        FROM account,\n             role,\n             permission,\n             account_role,\n             role_permission\n        WHERE account.mobile=#{mobile}\n          AND account.id=account_role.accountId\n          AND account_role.roleId=role.id\n          AND role_permission.roleId=role.id\n          AND role_permission.permissionId=permission.id\n    &lt;\/select>\n\n&lt;\/mapper><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u521b\u5efaService<\/h2>\n\n\n\n<p>AuthService.java<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package cn.com.sway.doctor.service.user.service;\n\nimport cn.com.sway.doctor.service.common.model.Account;\n\nimport java.util.List;\nimport java.util.Map;\n\npublic interface AuthService {\n\n    Account getAccountByMobile(String mobile);\n\n    List&lt;Map&lt;String,Object>> getAccountPower(String mobile);\n\n}\n<\/pre>\n\n\n\n<p>AuthServiceImpl.java<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package cn.com.sway.doctor.service.user.service.impl;\n\nimport cn.com.sway.doctor.service.common.model.Account;\nimport cn.com.sway.doctor.service.user.mapper.AuthMapper;\nimport cn.com.sway.doctor.service.user.service.AuthService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\nimport java.util.Map;\n\n@Service\npublic class AuthServiceImpl implements AuthService {\n\n    @Autowired\n    AuthMapper authMapper;\n\n    @Override\n    public Account getAccountByMobile(String mobile) {\n        return authMapper.getAccountByMobile(mobile);\n    }\n\n    @Override\n    public List&lt;Map&lt;String, Object>> getAccountPower(String mobile) {\n        return authMapper.getAccountPower(mobile);\n    }\n}\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u521b\u5efa\u9a8c\u8bc1\u65b9\u6cd5<\/h2>\n\n\n\n<p>ShiroRealm.java<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package cn.com.sway.doctor.service.user.shiro;\n\nimport cn.com.sway.doctor.service.common.model.Account;\nimport cn.com.sway.doctor.service.user.service.AuthService;\nimport org.apache.shiro.authc.AuthenticationException;\nimport org.apache.shiro.authc.AuthenticationInfo;\nimport org.apache.shiro.authc.AuthenticationToken;\nimport org.apache.shiro.authc.SimpleAuthenticationInfo;\nimport org.apache.shiro.authz.AuthorizationInfo;\nimport org.apache.shiro.authz.SimpleAuthorizationInfo;\nimport org.apache.shiro.realm.AuthorizingRealm;\nimport org.apache.shiro.subject.PrincipalCollection;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport java.util.List;\nimport java.util.Map;\n\npublic class ShiroRealm extends AuthorizingRealm {\n\n    @Autowired\n    private AuthService loginService;\n\n    \/**\n     * \u83b7\u53d6\u6743\u9650\n     * @param principalCollection\n     * @return\n     *\/\n    @Override\n    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {\n\n        \/\/\u83b7\u53d6\u767b\u5f55\u7528\u6237\u540d\n        String mobile = (String) principalCollection.getPrimaryPrincipal();\n        \/\/\u6dfb\u52a0\u89d2\u8272\u548c\u6743\u9650\n        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();\n\n        List&lt;Map&lt;String, Object>> powerList = loginService.getAccountPower(mobile);\n        System.out.println(powerList.toString());\n        for (Map&lt;String, Object> powerMap : powerList) {\n            \/\/\u6dfb\u52a0\u89d2\u8272\n            simpleAuthorizationInfo.addRole(String.valueOf(powerMap.get(\"role\")));\n            \/\/\u6dfb\u52a0\u6743\u9650\n            simpleAuthorizationInfo.addStringPermission(String.valueOf(powerMap.get(\"permission\")));\n        }\n        return simpleAuthorizationInfo;\n    }\n\n    \/**\n     * \u767b\u5f55\u8ba4\u8bc1\n     * @param authenticationToken\n     * @return\n     * @throws AuthenticationException\n     *\/\n    @Override\n    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {\n        \/\/\u52a0\u8fd9\u4e00\u6b65\u7684\u76ee\u7684\u662f\u5728Post\u8bf7\u6c42\u7684\u65f6\u5019\u4f1a\u5148\u8fdb\u8ba4\u8bc1\uff0c\u7136\u540e\u5728\u5230\u8bf7\u6c42\n        if (authenticationToken.getPrincipal() == null) {\n            return null;\n        }\n        \/\/\u83b7\u53d6\u7528\u6237\u552f\u4e00\u6807\u8bc6\n        String mobile = authenticationToken.getPrincipal().toString();\n        \/\/\u6839\u636e\u7528\u6237\u540d\u53bb\u6570\u636e\u5e93\u67e5\u8be2\u7528\u6237\u4fe1\u606f\n        Account account = loginService.getAccountByMobile(mobile);\n        if (account == null) {\n            \/\/\u8fd9\u91cc\u8fd4\u56de\u540e\u4f1a\u62a5\u51fa\u5bf9\u5e94\u5f02\u5e38\n            return null;\n        } else {\n            \/\/\u8fd9\u91cc\u9a8c\u8bc1authenticationToken\u548csimpleAuthenticationInfo\u7684\u4fe1\u606f\n            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(account, account.getPassword(), getName());\n            return simpleAuthenticationInfo;\n        }\n    }\n\n}\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u521b\u5efa\u914d\u7f6e\u6587\u4ef6<\/h2>\n\n\n\n<p>ShiroConfig.java<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package cn.com.sway.doctor.service.user.config;\n\nimport cn.com.sway.doctor.service.user.shiro.ShiroRealm;\nimport org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;\nimport org.apache.shiro.spring.web.ShiroFilterFactoryBean;\nimport org.apache.shiro.web.mgt.DefaultWebSecurityManager;\nimport org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class ShiroConfig {\n    @Bean\n    @ConditionalOnMissingBean\n    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {\n        DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();\n        defaultAAP.setProxyTargetClass(true);\n        return defaultAAP;\n    }\n\n    \/\/\u5c06\u81ea\u5df1\u7684\u9a8c\u8bc1\u65b9\u5f0f\u52a0\u5165\u5bb9\u5668\n    @Bean\n    public ShiroRealm shiroRealm() {\n        ShiroRealm shiroRealm = new ShiroRealm();\n        return shiroRealm;\n    }\n\n    \/\/\u6743\u9650\u7ba1\u7406\uff0c\u914d\u7f6e\u4e3b\u8981\u662fRealm\u7684\u7ba1\u7406\u8ba4\u8bc1\n    @Bean\n    public DefaultWebSecurityManager securityManager() {\n        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();\n        securityManager.setRealm(shiroRealm());\n        return securityManager;\n    }\n\n    \/\/shiro\u6838\u5fc3\u8fc7\u6ee4\u5668\n    @Bean(\"shiroFilter\")\n    public ShiroFilterFactoryBean shirFilter(DefaultWebSecurityManager securityManager) {\n        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();\n        shiroFilter.setSecurityManager(securityManager);\n        return shiroFilter;\n    }\n\n    @Bean\n    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {\n        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();\n        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);\n        return authorizationAttributeSourceAdvisor;\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u521b\u5efa\u6570\u636e<\/h2>\n\n\n\n<p>account\u8868\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-11.png\"><img loading=\"lazy\" decoding=\"async\" width=\"429\" height=\"149\" src=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-11.png\" alt=\"\" class=\"wp-image-1074\" srcset=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-11.png 429w, http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-11-300x104.png 300w\" sizes=\"auto, (max-width: 429px) 100vw, 429px\" \/><\/a><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n Navicat Premium Data Transfer\n\n Source Server         : localhost\n Source Server Type    : MySQL\n Source Server Version : 50623\n Source Host           : localhost:3306\n Source Schema         : sway-doctor-service-user\n\n Target Server Type    : MySQL\n Target Server Version : 50623\n File Encoding         : 65001\n\n Date: 24\/04\/2023 22:12:38\n*\/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for account\n-- ----------------------------\nDROP TABLE IF EXISTS `account`;\nCREATE TABLE `account`  (\n  `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `mobile` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;\n\nSET FOREIGN_KEY_CHECKS = 1;\n<\/pre>\n\n\n\n<p>role\u8868\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-12.png\"><img loading=\"lazy\" decoding=\"async\" width=\"177\" height=\"83\" src=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-12.png\" alt=\"\" class=\"wp-image-1075\"\/><\/a><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n Navicat Premium Data Transfer\n\n Source Server         : localhost\n Source Server Type    : MySQL\n Source Server Version : 50623\n Source Host           : localhost:3306\n Source Schema         : sway-doctor-service-user\n\n Target Server Type    : MySQL\n Target Server Version : 50623\n File Encoding         : 65001\n\n Date: 24\/04\/2023 22:14:30\n*\/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for role\n-- ----------------------------\nDROP TABLE IF EXISTS `role`;\nCREATE TABLE `role`  (\n  `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;\n\nSET FOREIGN_KEY_CHECKS = 1;\n<\/pre>\n\n\n\n<p>permission\u8868\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-13.png\"><img loading=\"lazy\" decoding=\"async\" width=\"311\" height=\"89\" src=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-13.png\" alt=\"\" class=\"wp-image-1076\" srcset=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-13.png 311w, http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-13-300x86.png 300w\" sizes=\"auto, (max-width: 311px) 100vw, 311px\" \/><\/a><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n Navicat Premium Data Transfer\n\n Source Server         : localhost\n Source Server Type    : MySQL\n Source Server Version : 50623\n Source Host           : localhost:3306\n Source Schema         : sway-doctor-service-user\n\n Target Server Type    : MySQL\n Target Server Version : 50623\n File Encoding         : 65001\n\n Date: 24\/04\/2023 22:14:19\n*\/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for permission\n-- ----------------------------\nDROP TABLE IF EXISTS `permission`;\nCREATE TABLE `permission`  (\n  `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;\n\nSET FOREIGN_KEY_CHECKS = 1;\n<\/pre>\n\n\n\n<p>account_role\u8868\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-14.png\"><img loading=\"lazy\" decoding=\"async\" width=\"278\" height=\"85\" src=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-14.png\" alt=\"\" class=\"wp-image-1077\"\/><\/a><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n Navicat Premium Data Transfer\n\n Source Server         : localhost\n Source Server Type    : MySQL\n Source Server Version : 50623\n Source Host           : localhost:3306\n Source Schema         : sway-doctor-service-user\n\n Target Server Type    : MySQL\n Target Server Version : 50623\n File Encoding         : 65001\n\n Date: 24\/04\/2023 22:14:08\n*\/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for account_role\n-- ----------------------------\nDROP TABLE IF EXISTS `account_role`;\nCREATE TABLE `account_role`  (\n  `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `accountId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `roleId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;\n\nSET FOREIGN_KEY_CHECKS = 1;\n<\/pre>\n\n\n\n<p>role_permission\u8868\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-15.png\"><img loading=\"lazy\" decoding=\"async\" width=\"322\" height=\"76\" src=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-15.png\" alt=\"\" class=\"wp-image-1078\" srcset=\"http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-15.png 322w, http:\/\/blog.sway.com.cn\/wp-content\/uploads\/2023\/04\/image-15-300x71.png 300w\" sizes=\"auto, (max-width: 322px) 100vw, 322px\" \/><\/a><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n Navicat Premium Data Transfer\n\n Source Server         : localhost\n Source Server Type    : MySQL\n Source Server Version : 50623\n Source Host           : localhost:3306\n Source Schema         : sway-doctor-service-user\n\n Target Server Type    : MySQL\n Target Server Version : 50623\n File Encoding         : 65001\n\n Date: 24\/04\/2023 22:14:36\n*\/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for role_permission\n-- ----------------------------\nDROP TABLE IF EXISTS `role_permission`;\nCREATE TABLE `role_permission`  (\n  `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `roleId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `permissionId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;\n\nSET FOREIGN_KEY_CHECKS = 1;\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f7f\u7528\u65b9\u6cd5<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package cn.com.sway.doctor.service.user.controller.api.v1;\n\nimport cn.com.sway.doctor.service.common.model.Account;\nimport cn.com.sway.doctor.service.common.query.AccountQuery;\nimport cn.com.sway.doctor.service.user.dao.AccountDao;\nimport org.apache.shiro.authz.annotation.*;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n\n@RestController\n@RequestMapping(\"\/api\/v1\/accounts\")\npublic class AccountsApiControllerV1 {\n\n    @Autowired\n    private AccountDao accountDao;\n\n    \/\/@RequiresAuthentication\n    \/\/@RequiresGuest\n    \/\/@RequiresUser\n    @RequiresRoles(\"admin\")\n    \/\/@RequiresPermissions(\"account-manage\")\n    @ResponseBody\n    @GetMapping(\"\")\n    public String query() {\n\n        AccountQuery accountQuery = new AccountQuery();\n        List&lt;Account> list = accountDao.query(accountQuery);\n\n        System.out.println(accountDao.query(accountQuery).size());\n\n        return \"account total: \"+list.size();\n    }\n\n}\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5f15\u5165Shiro\u4f9d\u8d56 \u521b\u5efapojo\u5b9e\u4f53\u7c7b Account.java\uff08\u8d26\u53f7\uff09 Role.java\uff08\u89d2\u8272\uff09 Perm [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1070","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/1070","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1070"}],"version-history":[{"count":5,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/1070\/revisions"}],"predecessor-version":[{"id":1082,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/1070\/revisions\/1082"}],"wp:attachment":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1070"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}