Explorar el Código

feat:shiro引入

wangzaijun hace 7 meses
padre
commit
97a430e988

+ 38 - 1
pom.xml

@@ -23,6 +23,7 @@
         <mybatis-plus-boot3.version>3.5.7</mybatis-plus-boot3.version>
         <dameng.version>8.1.3.62</dameng.version>
         <daq.version>1.0.0</daq.version>
+        <apache-shiro.version>2.0.1</apache-shiro.version>
     </properties>
 
     <modules>
@@ -63,6 +64,42 @@
                 <version>${dameng.version}</version>
             </dependency>
 
+            <!-- shiro Jakarta兼容 -->
+            <dependency>
+                <groupId>org.apache.shiro</groupId>
+                <artifactId>shiro-core</artifactId>
+                <classifier>jakarta</classifier>
+                <version>${apache-shiro.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.shiro</groupId>
+                <artifactId>shiro-web</artifactId>
+                <classifier>jakarta</classifier>
+                <version>${apache-shiro.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.shiro</groupId>
+                        <artifactId>shiro-core</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.shiro</groupId>
+                <artifactId>shiro-spring</artifactId>
+                <classifier>jakarta</classifier>
+                <version>${apache-shiro.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.shiro</groupId>
+                        <artifactId>shiro-core</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.apache.shiro</groupId>
+                        <artifactId>shiro-web</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+
             <!-- 私有库 -->
             <dependency>
                 <groupId>com.smppw</groupId>
@@ -79,7 +116,7 @@
                 <artifactId>joda-time</artifactId>
                 <version>${joda-time.version}</version>
             </dependency>
-
+            <!-- hutool 工具,按需引入 -->
             <dependency>
                 <groupId>cn.hutool</groupId>
                 <artifactId>hutool-core</artifactId>

+ 43 - 0
service-base/pom.xml

@@ -13,6 +13,18 @@
     <description>核心模块</description>
 
     <dependencies>
+        <!-- 引入web依赖,但是排除启动容器 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
         <dependency>
             <groupId>com.dameng</groupId>
             <artifactId>DmJdbcDriver18</artifactId>
@@ -36,6 +48,23 @@
             <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
         </dependency>
 
+        <!-- shiro jakarta兼容 -->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-core</artifactId>
+            <classifier>jakarta</classifier>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-web</artifactId>
+            <classifier>jakarta</classifier>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+            <classifier>jakarta</classifier>
+        </dependency>
+
         <!-- 私有库 -->
         <dependency>
             <groupId>com.smppw</groupId>
@@ -113,4 +142,18 @@
             <version>3.17</version>
         </dependency>
     </dependencies>
+
+    <repositories>
+        <repository>
+            <id>smppw-release</id>
+            <url>http://120.24.213.180:8081/nexus/content/repositories/releases/</url>
+        </repository>
+        <repository>
+            <id>smppw-snapshots</id>
+            <url>http://120.24.213.180:8081/nexus/content/repositories/snapshots/</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
 </project>

+ 18 - 0
service-base/src/main/java/com/simuwang/base/pojo/SysUser.java

@@ -0,0 +1,18 @@
+package com.simuwang.base.pojo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class SysUser {
+    private String userId;
+
+    private String username;
+
+    private String realName;
+
+    private String salt;
+
+    private String password;
+}

+ 142 - 0
service-base/src/main/java/com/simuwang/shiro/LinkProperties.java

@@ -0,0 +1,142 @@
+package com.simuwang.shiro;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+
+public class LinkProperties extends Properties {
+    private List<Object> keyList = new ArrayList<Object>();
+
+    /**
+     * 默认构造方法
+     */
+    public LinkProperties() {
+
+    }
+
+    /**
+     * 从指定路径加载信息到Properties
+     *
+     * @param path
+     */
+    public LinkProperties(String path) {
+        try {
+            InputStream is = new FileInputStream(path);
+            this.load(is);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            throw new RuntimeException("指定文件不存在!");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 重写put方法,按照property的存入顺序保存key到keyList,遇到重复的后者将覆盖前者。
+     */
+    @Override
+    public synchronized Object put(Object key, Object value) {
+        this.removeKeyIfExists(key);
+        keyList.add(key);
+        return super.put(key, value);
+    }
+
+
+    /**
+     * 重写remove方法,删除属性时清除keyList中对应的key。
+     */
+    @Override
+    public synchronized Object remove(Object key) {
+        this.removeKeyIfExists(key);
+        return super.remove(key);
+    }
+
+    /**
+     * keyList中存在指定的key时则将其删除
+     */
+    private void removeKeyIfExists(Object key) {
+        keyList.remove(key);
+    }
+
+    /**
+     * 获取Properties中key的有序集合
+     *
+     * @return
+     */
+    public List<Object> getKeyList() {
+        return keyList;
+    }
+
+    /**
+     * 保存Properties到指定文件,默认使用UTF-8编码
+     *
+     * @param path 指定文件路径
+     */
+    public void store(String path) {
+        this.store(path, "UTF-8");
+    }
+
+    /**
+     * 保存Properties到指定文件,并指定对应存放编码
+     *
+     * @param path    指定路径
+     * @param charset 文件编码
+     */
+    public void store(String path, String charset) {
+        if (path != null && !"".equals(path)) {
+            try {
+                OutputStream os = new FileOutputStream(path);
+                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, charset));
+                this.store(bw, null);
+                bw.close();
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        } else {
+            throw new RuntimeException("存储路径不能为空!");
+        }
+    }
+
+    /**
+     * 重写keys方法,返回根据keyList适配的Enumeration,且保持HashTable keys()方法的原有语义,
+     * 每次都调用返回一个新的Enumeration对象,且和之前的不产生冲突
+     */
+    @Override
+    public synchronized Enumeration<Object> keys() {
+        return new EnumerationAdapter<Object>(keyList);
+    }
+
+    /**
+     * List到Enumeration的适配器
+     */
+    private class EnumerationAdapter<T> implements Enumeration<T> {
+        private final List<T> list;
+        private final boolean isEmpty;
+        private int index = 0;
+
+        public EnumerationAdapter(List<T> list) {
+            this.list = list;
+            this.isEmpty = list.isEmpty();
+        }
+
+        public boolean hasMoreElements() {
+            //isEmpty的引入是为了更贴近HashTable原有的语义,在HashTable中添加元素前调用其keys()方法获得一个Enumeration的引用,
+            //之后往HashTable中添加数据后,调用之前获取到的Enumeration的hasMoreElements()将返回false,但如果此时重新获取一个
+            //Enumeration的引用,则新Enumeration的hasMoreElements()将返回true,而且之后对HashTable数据的增、删、改都是可以在
+            //nextElement中获取到的。
+            return !isEmpty && index < list.size();
+        }
+
+        public T nextElement() {
+            if (this.hasMoreElements()) {
+                return list.get(index++);
+            }
+            return null;
+        }
+
+    }
+}

+ 32 - 0
service-base/src/main/java/com/simuwang/shiro/PropertiesUtil.java

@@ -0,0 +1,32 @@
+package com.simuwang.shiro;
+
+import cn.hutool.core.util.StrUtil;
+
+public class PropertiesUtil {
+    public static LinkProperties propertiesShiro = new LinkProperties();
+
+    /**
+     * 读取properties配置文件信息
+     */
+    static {
+        String sysName = System.getProperty("sys.name");
+        if (StrUtil.isBlank(sysName)) {
+            sysName = "authc.properties";
+        } else {
+            sysName += ".properties";
+        }
+        try {
+            propertiesShiro.load(PropertiesUtil.class.getClassLoader()
+                    .getResourceAsStream(sysName));
+        } catch (Exception e) {
+//            log.warn("资源路径中不存在authentication.properties权限文件,忽略读取!");
+        }
+    }
+
+    /**
+     * 根据key得到value的值
+     */
+    public static String getShiroValue(String key) {
+        return propertiesShiro.getProperty(key);
+    }
+}

+ 134 - 0
service-base/src/main/java/com/simuwang/shiro/config/ShiroConfig.java

@@ -0,0 +1,134 @@
+//package com.simuwang.shiro.config;
+//
+//import com.simuwang.shiro.PropertiesUtil;
+//import com.simuwang.shiro.core.ShiroDbRealm;
+//import com.simuwang.shiro.core.adapter.AuthAdapter;
+//import com.simuwang.shiro.core.adapter.SimpleAuthAdapter;
+//import com.simuwang.shiro.core.bridge.AuthBridgeService;
+//import com.simuwang.shiro.core.impl.ShiroDbRealmImpl;
+//import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+//import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+//import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+//import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+//import org.apache.shiro.web.servlet.SimpleCookie;
+//import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+//import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.DependsOn;
+//
+//import java.util.LinkedHashMap;
+//import java.util.List;
+//import java.util.Map;
+//
+//@Configuration
+//public class ShiroConfig {
+//    /**
+//     * @Description 保证实现了Shiro内部lifecycle函数的bean执行
+//     */
+//    @Bean(name = "lifecycleBeanPostProcessor")
+//    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
+//        return new LifecycleBeanPostProcessor();
+//    }
+//
+//    @Bean
+//    public AuthAdapter authAdapter() {
+//        return new SimpleAuthAdapter();
+//    }
+//
+//    @Bean
+//    public AuthBridgeService authBridgeService() {
+//        return new AuthBridgeService(this.authAdapter());
+//    }
+//
+//    /**
+//     * @Description 创建cookie对象
+//     */
+//    @Bean(name = "sessionIdCookie")
+//    public SimpleCookie simpleCookie() {
+//        SimpleCookie simpleCookie = new SimpleCookie();
+//        simpleCookie.setName("ShiroSession");
+//        return simpleCookie;
+//    }
+//
+//    /**
+//     * @Description 权限管理器
+//     */
+//    @Bean(name = "securityManager")
+//    public DefaultWebSecurityManager defaultWebSecurityManager() {
+//        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+//        securityManager.setRealm(shiroDbRealm());
+//        securityManager.setSessionManager(shiroSessionManager());
+//        return securityManager;
+//    }
+//
+//    /**
+//     * @Description 自定义RealmImpl
+//     */
+//    @Bean(name = "shiroDbRealm")
+//    public ShiroDbRealm shiroDbRealm() {
+//        return new ShiroDbRealmImpl(this.authBridgeService());
+//    }
+//
+//    /**
+//     * @Description 会话管理器
+//     */
+//    @Bean(name = "sessionManager")
+//    public DefaultWebSessionManager shiroSessionManager() {
+//        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
+//        sessionManager.setSessionValidationSchedulerEnabled(false);
+//        sessionManager.setSessionIdCookieEnabled(true);
+//        sessionManager.setSessionIdCookie(simpleCookie());
+//        sessionManager.setGlobalSessionTimeout(3600000);
+//        return sessionManager;
+//    }
+//
+//    /**
+//     * @Description AOP式方法级权限检查
+//     */
+//    @Bean
+//    @DependsOn("lifecycleBeanPostProcessor")
+//    public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
+//        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
+//        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
+//        return defaultAdvisorAutoProxyCreator;
+//    }
+//
+//    /**
+//     * @Description 配合DefaultAdvisorAutoProxyCreator事项注解权限校验
+//     */
+//    @Bean
+//    public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {
+//        AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
+//        aasa.setSecurityManager(defaultWebSecurityManager());
+//        return new AuthorizationAttributeSourceAdvisor();
+//    }
+//
+//    /**
+//     * @Description 过滤器链
+//     */
+//    private Map<String, String> filterChainDefinition() {
+//        List<Object> list = PropertiesUtil.propertiesShiro.getKeyList();
+//        Map<String, String> map = new LinkedHashMap<>();
+//        for (Object object : list) {
+//            String key = object.toString();
+//            String value = PropertiesUtil.getShiroValue(key);
+////            log.info("读取防止盗链控制:---key{},---value:{}", key, value);
+//            map.put(key, value);
+//        }
+//        return map;
+//    }
+//
+//    /**
+//     * @Description Shiro过滤器
+//     */
+//    @Bean("shiroFilter")
+//    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
+//        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
+//        shiroFilter.setSecurityManager(defaultWebSecurityManager());
+//        shiroFilter.setFilterChainDefinitionMap(filterChainDefinition());
+//        shiroFilter.setLoginUrl("/login");
+//        shiroFilter.setUnauthorizedUrl("/login");
+//        return shiroFilter;
+//    }
+//}

+ 41 - 0
service-base/src/main/java/com/simuwang/shiro/core/ShiroDbRealm.java

@@ -0,0 +1,41 @@
+package com.simuwang.shiro.core;
+
+import jakarta.annotation.PostConstruct;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/6 17:16
+ * @description 自定义的shiro realm
+ */
+public abstract class ShiroDbRealm extends AuthorizingRealm {
+    /**
+     * principals 令牌
+     *
+     * @param principalCollection 用户信息
+     * @return /
+     */
+    @Override
+    public abstract AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection);
+
+    /**
+     * authToken 对象
+     *
+     * @param authenticationToken 认证后的token
+     * @return /
+     * @throws AuthenticationException /
+     */
+    @Override
+    public abstract AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException;
+
+    /**
+     * 密码匹配器
+     */
+    @PostConstruct
+    public abstract void initCredentialsMatcher();
+}

+ 36 - 0
service-base/src/main/java/com/simuwang/shiro/core/ShiroToken.java

@@ -0,0 +1,36 @@
+package com.simuwang.shiro.core;
+
+import org.apache.shiro.authc.UsernamePasswordToken;
+
+public class ShiroToken extends UsernamePasswordToken {
+    private String tokenType;
+
+    private String quickPassword;
+
+    public ShiroToken(String tokenType, String username,String password) {
+        super(username,password);
+        this.tokenType = tokenType;
+    }
+
+    public ShiroToken(String tokenType, String username,String password,String quickPassword) {
+        super(username,password);
+        this.tokenType = tokenType;
+        this.quickPassword = quickPassword;
+    }
+
+    public String getTokenType() {
+        return tokenType;
+    }
+
+    public void setTokenType(String tokenType) {
+        this.tokenType = tokenType;
+    }
+
+    public String getQuickPassword() {
+        return quickPassword;
+    }
+
+    public void setQuickPassword(String quickPassword) {
+        this.quickPassword = quickPassword;
+    }
+}

+ 27 - 0
service-base/src/main/java/com/simuwang/shiro/core/ShiroUser.java

@@ -0,0 +1,27 @@
+package com.simuwang.shiro.core;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/6 17:46
+ * @description 用户令牌
+ */
+@Setter
+@Getter
+public class ShiroUser {
+    private String userId;
+
+    private String username;
+
+    private String realName;
+
+    private String salt;
+
+    private String password;
+
+    private List<String> permissionCodes;
+}

+ 18 - 0
service-base/src/main/java/com/simuwang/shiro/core/adapter/AuthAdapter.java

@@ -0,0 +1,18 @@
+package com.simuwang.shiro.core.adapter;
+
+import com.simuwang.base.pojo.SysUser;
+
+import java.util.List;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/6 17:44
+ * @description 认证与授权的用户信息适配器(访问数据库和缓存)
+ */
+public interface AuthAdapter {
+    SysUser findUserByUsername(String username);
+
+    List<String> findRoleByUserId(String userId);
+
+    List<String> findPermissionsByUserId(String userId);
+}

+ 33 - 0
service-base/src/main/java/com/simuwang/shiro/core/adapter/SimpleAuthAdapter.java

@@ -0,0 +1,33 @@
+package com.simuwang.shiro.core.adapter;
+
+import cn.hutool.core.collection.ListUtil;
+import com.simuwang.base.pojo.SysUser;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/6 17:44
+ * @description 认证与授权的用户信息适配器(访问数据库和缓存)
+ */
+@Component
+public class SimpleAuthAdapter implements AuthAdapter {
+    @Override
+    public SysUser findUserByUsername(String username) {
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId("1");
+        sysUser.setUsername("admin");
+        return sysUser;
+    }
+
+    @Override
+    public List<String> findRoleByUserId(String userId) {
+        return ListUtil.toList("ADMIN");
+    }
+
+    @Override
+    public List<String> findPermissionsByUserId(String userId) {
+        return ListUtil.toList("1");
+    }
+}

+ 50 - 0
service-base/src/main/java/com/simuwang/shiro/core/bridge/AuthBridgeService.java

@@ -0,0 +1,50 @@
+package com.simuwang.shiro.core.bridge;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.simuwang.base.pojo.SysUser;
+import com.simuwang.shiro.core.ShiroUser;
+import com.simuwang.shiro.core.adapter.AuthAdapter;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/6 17:42
+ * @description 授权与认证的用户信息桥接接口
+ */
+@Service
+public class AuthBridgeService {
+    private final AuthAdapter authAdapter;
+
+    public AuthBridgeService(AuthAdapter authAdapter) {
+        this.authAdapter = authAdapter;
+    }
+
+    public ShiroUser findUserByUsername(String username) {
+        SysUser sysUser = this.authAdapter.findUserByUsername(username);
+        return BeanUtil.copyProperties(sysUser, ShiroUser.class);
+    }
+
+    public AuthorizationInfo getAuthorizationInfo(ShiroUser shiroUser) {
+        //查询用户对应的角色标识
+        List<String> roleList = this.findRoles(shiroUser.getUserId());
+        //查询用户对于的资源标识
+        List<String> resourcesList = this.findPermissions(shiroUser.getUserId());
+        //构建鉴权信息对象
+        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
+        simpleAuthorizationInfo.addRoles(roleList);
+        simpleAuthorizationInfo.addStringPermissions(resourcesList);
+        return simpleAuthorizationInfo;
+    }
+
+    public List<String> findRoles(String userId) {
+        return this.authAdapter.findRoleByUserId(userId);
+    }
+
+    public List<String> findPermissions(String userId) {
+        return this.authAdapter.findPermissionsByUserId(userId);
+    }
+}

+ 47 - 0
service-base/src/main/java/com/simuwang/shiro/core/impl/ShiroDbRealmImpl.java

@@ -0,0 +1,47 @@
+package com.simuwang.shiro.core.impl;
+
+import com.simuwang.shiro.core.ShiroDbRealm;
+import com.simuwang.shiro.core.ShiroToken;
+import com.simuwang.shiro.core.ShiroUser;
+import com.simuwang.shiro.core.bridge.AuthBridgeService;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.lang.util.ByteSource;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ShiroDbRealmImpl extends ShiroDbRealm {
+    private final AuthBridgeService authBridgeService;
+
+    public ShiroDbRealmImpl(AuthBridgeService authBridgeService) {
+        this.authBridgeService = authBridgeService;
+    }
+
+    @Override
+    public AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+        ShiroUser shiroUser = (ShiroUser) principals.getPrimaryPrincipal();
+        return this.authBridgeService.getAuthorizationInfo(shiroUser);
+    }
+
+    @Override
+    public AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
+        ShiroToken token = (ShiroToken) authenticationToken;
+        ShiroUser shiroUser = this.authBridgeService.findUserByUsername(token.getUsername());
+        if (shiroUser == null) {
+            throw new UnknownAccountException("账号不存在");
+        }
+        shiroUser.setPermissionCodes(this.authBridgeService.findPermissions(shiroUser.getUserId()));
+        String salt = shiroUser.getSalt();
+        String password = shiroUser.getPassword();
+        return new SimpleAuthenticationInfo(shiroUser, password, ByteSource.Util.bytes(salt), getName());
+    }
+
+    @Override
+    public void initCredentialsMatcher() {
+        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher("bcrypt");
+        matcher.setHashIterations(1000);
+        setCredentialsMatcher(matcher);
+    }
+}

+ 5 - 0
service-base/src/main/resources/authc.properties

@@ -0,0 +1,5 @@
+/static/**=anon
+
+/login/**=anon
+
+/**=authc

+ 0 - 10
service-deploy/pom.xml

@@ -16,16 +16,6 @@
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-tomcat</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-undertow</artifactId>
         </dependency>
 

+ 18 - 0
service-manage/src/main/java/com/simuwang/manage/api/LoginController.java

@@ -0,0 +1,18 @@
+//package com.simuwang.manage.api;
+//
+//import com.simuwang.shiro.core.ShiroToken;
+//import org.apache.shiro.SecurityUtils;
+//import org.apache.shiro.subject.Subject;
+//import org.springframework.web.bind.annotation.PostMapping;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RequestParam;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//@RestController
+//@RequestMapping("/")
+//public class LoginController {
+//    @PostMapping("login")
+//    public String login() {
+//        return "/login";
+//    }
+//}

+ 14 - 0
service-manage/src/main/java/com/simuwang/manage/api/TestController.java

@@ -0,0 +1,14 @@
+package com.simuwang.manage.api;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/test")
+public class TestController {
+    @GetMapping("hello")
+    public String test() {
+        return "hello";
+    }
+}