zoukankan      html  css  js  c++  java
  • 4.SSM配置shiro权限管理

     作者QQ:1095737364    QQ群:123300273     欢迎加入!

    1.搭建SSM项目:

        http://www.cnblogs.com/yysbolg/p/6909021.html

    2.在http的resources文件夹下新建shiro配置文件:shiro.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
           default-lazy-init="true">
    
        <description>Shiro安全配置</description>
    
        <!--安全管理器-->
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            <!--设置自定义Realm-->
            <property name="realm" ref="shiroDbRealm"/>
            <!--将缓存管理器,交给安全管理器-->
            <property name="cacheManager" ref="shiroEhcacheManager"/>
            <!-- 记住密码管理 -->
            <property name="rememberMeManager" ref="rememberMeManager"/>
        </bean>
    
        <!-- 項目自定义的Realm -->
        <bean id="shiroDbRealm" class="com.yys.http.shiro.ShiroDbRealm"/>
    
        <!-- 记住密码Cookie -->
        <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
            <constructor-arg value="rememberMe"/>
            <property name="httpOnly" value="true"/>
            <!-- 7天,采用spring el计算方便修改[细节决定成败]! -->
            <property name="maxAge" value="#{7 * 24 * 60 * 60}"/>
        </bean>
    
        <!-- rememberMe管理器,cipherKey生成见{@code Base64Test.java} -->
        <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
            <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('5aaC5qKm5oqA5pyvAAAAAA==')}"/>
            <property name="cookie" ref="rememberMeCookie"/>
        </bean>
    
        <!-- Shiro Filter -->
        <!-- Shiro Filter -->
        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
            <!-- 安全管理器 -->
            <property name="securityManager" ref="securityManager"/>
            <!-- 默认的登陆访问url -->
            <property name="loginUrl" value="/login"/>
            <!-- 登陆成功后跳转的url -->
            <property name="successUrl" value="/index"/>
            <!-- 没有权限跳转的url -->
            <property name="unauthorizedUrl" value="/unauth"/>
            <property name="filterChainDefinitions">
                <value>
                    <!--
                        anon  不需要认证
                        authc 需要认证
                        user  验证通过或RememberMe登录的都可以
                    -->
                    /index = anon
                    /login = anon
                    /** = authc
                </value>
            </property>
        </bean>
    
        <!-- 用户授权信息Cache, 采用EhCache -->
        <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
            <property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/>
        </bean>
    
        <!-- 在方法中 注入  securityManager ,进行代理控制 -->
        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
            <property name="arguments" ref="securityManager"/>
        </bean>
    
        <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
        <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
    
        <!-- AOP式方法级权限检查  -->
        <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
              depends-on="lifecycleBeanPostProcessor"/>
    
        <!-- 启用shrio授权注解拦截方式 -->
        <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
            <property name="securityManager" ref="securityManager"/>
        </bean>
    </beans>
    View Code

    3.在http的resources文件夹下新建缓冲配置文件:ehcache-shiro.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache updateCheck="false" name="shiroCache">
    
        <defaultCache
                maxElementsInMemory="10000"
                eternal="false"
                timeToIdleSeconds="120"
                timeToLiveSeconds="120"
                overflowToDisk="false"
                diskPersistent="false"
                diskExpiryThreadIntervalSeconds="120"
                />
    </ehcache>
    View Code

    4.修改Spring的applicationContext.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-3.1.xsd
                            http://www.springframework.org/schema/aop
                            http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!-- spring管理接口和事物,只扫描 -->
        <context:component-scan base-package="com.yys.common.*,com.yys.http.*">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        </context:component-scan>
        <!-- 引入配置文件 -->
        <bean id="propertyConfigurer"
              class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="location" value="classpath:application.properties" />
        </bean>
        <aop:aspectj-autoproxy/>
        <import resource="spring-datasource-master.xml"/>
        <import resource="spring-datasource-slave.xml"/>
        <import resource="classpath:spring-shiro.xml"/>
    </beans>
    View Code

    5.修改SpringMVC的spring-mvc.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-3.1.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
        <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
        <context:component-scan base-package="com.yys.http.*" >
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        </context:component-scan>
        <!--
        <mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。
        <mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,
        是spring MVC为@Controllers分发请求所必须的。 并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,
        @Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。后面,我们处理响应ajax请求时,就使用到了对json的支持。
        后面,对action写JUnit单元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter
        两个bean,来完成测试,取的时候要知道是<mvc:annotation-driven />这一句注册的这两个bean。
         -->
    <!--    <mvc:annotation-driven />
        &lt;!&ndash;  避免IE执行AJAX时,返回JSON出现下载文件&ndash;&gt;
        <bean id="mappingJacksonHttpMessageConverter"
              class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>application/json;charset=UTF-8</value>
                    <value>text/html;charset=UTF-8</value>
                </list>
            </property>
        </bean>
        &lt;!&ndash; 启动SpringMVC的注解功能,完成请求和注解POJO的映射 &ndash;&gt;
        <bean
                class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <ref bean="mappingJacksonHttpMessageConverter" /> &lt;!&ndash; JSON转换器 &ndash;&gt;
                </list>
            </property>
        </bean>-->
        <mvc:annotation-driven>
            <mvc:message-converters>
                <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
                <bean class="org.springframework.http.converter.FormHttpMessageConverter" />
                <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
                <!--<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />-->
                <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" />
            </mvc:message-converters>
        </mvc:annotation-driven>
        <mvc:default-servlet-handler />
    
        <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
        <!-- 支持JSON数据格式 -->
        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/><!-- 解析导出文件byte流 -->
                    <ref bean="fastJsonHttpMessageConverter" />
                    <!--
                                <ref bean="mappingJacksonHttpMessageConverter" />
                     -->
                </list>
            </property>
        </bean>
        <!--<bean id="mappingJacksonHttpMessageConverter"
            class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        </bean>-->
        <!-- 使用fastJson来支持JSON数据格式 -->
        <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                    <value>application/json</value>
                </list>
            </property>
            <property name="features">
                <list>
                    <value>WriteMapNullValue</value>
                    <value>QuoteFieldNames</value>
                </list>
            </property>
        </bean>
    
    
    
        <!-- 定义跳转的文件的前后缀 ,视图模式配置-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
            <property name="prefix" value="/WEB-INF/view/" />
            <property name="suffix" value=".jsp" />
        </bean>
    
        <!-- 静态资源配置 -->
    
        <mvc:resources mapping="/static/**" location="static/"/>
    
      <!--  <aop:config proxy-target-class="true"/>
        <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
            <property name="securityManager" ref="securityManager"/>
        </bean>-->
    
        <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
            <property name="exceptionMappings">
                <props>
                    <prop key="org.apache.shiro.authz.UnauthorizedException">/template/front/404</prop>
                    <prop key="java.lang.Throwable">/template/front/500</prop>
                </props>
            </property>
            <property name="statusCodes">
                <props>
                    <prop key="500">500</prop>
                    <prop key="404">404</prop>
                    <prop key="403">403</prop>
                </props>
            </property>
            <property name="warnLogCategory" value="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" />
            <property name="defaultErrorView" value="/template/front/500" />
            <property name="defaultStatusCode" value="200" />
        </bean>
        <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
            <property name="securityManager" ref="securityManager" />
        </bean>
        <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
            <property name="proxyTargetClass" value="true" />
        </bean>
    
       <!-- &lt;!&ndash; 支持Shiro对Controller的方法级AOP安全控制 begin&ndash;&gt;
        <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
            <property name="proxyTargetClass" value="true" />
        </bean>
        &lt;!&ndash; 保证实现了Shiro内部lifecycle函数的bean执行 &ndash;&gt;
        <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>-->
        <!-- 拦截器配置 -->
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean  class="com.yys.http.interceptor.HttpInterceptor">
                    <!--是否开启longebo头部信息认证-->
                    <property name="isYysblogAccess" value="true"/>
                    <property name="allowUrls">
                        <list>
                            <!-- 如果请求中包含以下路径,则不进行拦截 -->
                            <value>/</value>
                            <value>/static</value>
                        </list>
                    </property>
                </bean>
            </mvc:interceptor>
        </mvc:interceptors>
    </beans>
    View Code

    6.在web.xml中添加Shiro Filter:

    <!-- shiro的filter -->
      <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <init-param>
          <param-name>targetFilterLifecycle</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
          <param-name>targetBeanName</param-name>
          <param-value>shiroFilter</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    View Code

    7.在总工程目录下面pop.xml文件中添加一下依赖包:

     <!--shiro 权限工具-->
            <!-- shiro 工具包-->
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring</artifactId>
                <version>${shiro.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-ehcache</artifactId>
                <version>${shiro.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-core</artifactId>
                <version>${shiro.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-web</artifactId>
                <version>${shiro.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-quartz</artifactId>
                <version>${shiro.version}</version>
            </dependency>
            <!--事物依赖包-->
          <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>${aspectj.version}</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>${aspectj.version}</version>
            </dependency>
            <!--AOP 底层的动态代理-->
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>2.2.2</version>
            </dependency>    
    View Code

    8.shiro 权限认证类:ShiroDbRealm.java

    package com.yys.http.shiro;
    
    import com.yys.common.entity.User;
    import com.yys.common.service.RoleService;
    import com.yys.common.service.UserRoleService;
    import com.yys.common.service.UserService;
    import com.yys.common.util.StringUtils;
    import org.apache.shiro.authc.*;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    
    
    import javax.persistence.criteria.CriteriaBuilder;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    /**
     * User: 杨永生
     * Date: 10:08 2017/9/4
     * Email: 1095737364@qq.com
     */
    public class ShiroDbRealm extends AuthorizingRealm {
        private static final Logger LOGGER = LoggerFactory.getLogger(ShiroDbRealm.class);
    
        @Autowired
        private UserService userService;
    
        @Autowired
        private RoleService roleService;
    
        @Autowired
        private UserRoleService userRoleService;
    
        /**
         * Shiro登录认证(原理:用户提交 用户名和密码  --- shiro 封装令牌 ---- realm 通过用户名将密码查询返回 ---- shiro 自动去比较查询出密码和用户输入密码是否一致---- 进行登陆控制 )
         */
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(
                AuthenticationToken authcToken) throws AuthenticationException {
            LOGGER.info("Shiro开始登录认证");
            UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
            User user = userService.findUserByUserName(token.getUsername());//查询可以自己设置个值模拟数据库查询
            // 账号不存在
            if (user == null) {
                return null;
            }
            // 账号未启用
    //        if (user.getStatus() == 1) {
    //            return null;
    //        }
            List<Integer> roleList = userRoleService.findRoleIdListByUserId(user.getUserId());//查询可以自己设置个值模拟数据库查询
            ShiroUser shiroUser = new ShiroUser(user.getUserId(),  user.getUserName(), roleList);
            // 认证缓存信息
            return new SimpleAuthenticationInfo(shiroUser, user.getPassword().toCharArray(), getName());
    
        }
    
        /**
         * Shiro权限认证
         */
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            LOGGER.info("Shiro权限认证");
          ShiroUser shiroUser = (ShiroUser) principals.getPrimaryPrincipal();
            List<Integer> roleList = shiroUser.roleList;
            Set<String> urlSet = new HashSet<String>();
            for (Integer roleId : roleList) {
                List<Map<Integer, String>> roleResourceList = roleService.findRoleResourceListByRoleId(roleId);//查询可以自己设置个值模拟数据库查询
                if (roleResourceList != null) {
                    for (Map<Integer, String> map : roleResourceList) {
                        if (!StringUtils.isNullOrEmpty(map.get("url"))) {
                            urlSet.add(map.get("url"));
                        }
                    }
                }
            }
            //添加角色
    //        Set<String> roles=new HashSet<String>();
    //        roles.add("admin");
    //        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
    
            //不添加角色 ,只添加资源
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            info.addStringPermissions(urlSet);
            return info;
        }
    
        public UserService getUserService() {
            return userService;
        }
    
        public void setUserService(UserService userService) {
            this.userService = userService;
        }
    
        public RoleService getRoleService() {
            return roleService;
        }
    
        public void setRoleService(RoleService roleService) {
            this.roleService = roleService;
        }
    
        public UserRoleService getUserRoleService() {
            return userRoleService;
        }
    
        public void setUserRoleService(UserRoleService userRoleService) {
            this.userRoleService = userRoleService;
        }
    }
    View Code

    9.封装实体类:ShiroUser.java

    package com.yys.http.shiro;
    
    import java.io.Serializable;
    import java.util.List;
    /**
     * User: 杨永生
     * Date: 10:08 2017/9/4
     * Email: 1095737364@qq.com
     */
    
    public class ShiroUser implements Serializable {
    
        private static final long serialVersionUID = -1373760761780840081L;
        public Integer id;
        public String name;
        public List<Integer> roleList;
    
        public ShiroUser(Integer id, String name, List<Integer> roleList) {
            this.id = id;
            this.name = name;
            this.roleList = roleList;
        }
    
        public String getName() {
            return name;
        }
    
        /**
         * 本函数输出将作为默认的<shiro:principal/>输出.
         */
        @Override
        public String toString() {
            return name;
        }
    }
    View Code

    10.controller控制类:UserController.java

    package com.yys.http.controller;
    
    
    import com.yys.common.entity.User;
    import com.yys.common.service.UserService;
    import com.yys.common.util.DigestUtils;
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.DisabledAccountException;
    import org.apache.shiro.authc.IncorrectCredentialsException;
    import org.apache.shiro.authc.UnknownAccountException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.authz.annotation.RequiresRoles;
    import org.apache.shiro.subject.Subject;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.servlet.ModelAndView;
    /**
     * 用户操作表
     * User: 杨永生
     * Date: 15:09 2017/9/1
     * Email: 1095737364@qq.com
     */
    @Controller
    public class UserController {
    
        @Autowired
        private UserService userSerivce;
    
        /**
         * 首页get请求
         * @return
         */
        @RequestMapping(value = "/", method = {RequestMethod.GET})
        public String index() {
            //判断 是否 已经登陆认证: 认证成功就跳转到index 页面
            if (SecurityUtils.getSubject().isAuthenticated()) {
                return "index";
            }
            return "redirect:/login";
        }
        /**
         * 首页
         *
         * @return
         */
        @RequestMapping(value = "/index", method = {RequestMethod.GET})
        public String index2() {
            if (SecurityUtils.getSubject().isAuthenticated()) {
                return "index";
            }
            return "redirect:/login";
        }
    
        /**
         * GET 登录
         * @return {String}
         */
        @RequestMapping(value = "/login", method = {RequestMethod.GET})
        public String login() {
            if (SecurityUtils.getSubject().isAuthenticated()) {
                return "redirect:/index";
            }
            return "login";
        }
        /**
         * 登陆
         * @return
         */
        @RequestMapping(value = "/login", method = {RequestMethod.POST})
        @ResponseBody
        public String login(User user) {
            Subject userShiro = SecurityUtils.getSubject();
            UsernamePasswordToken token = new UsernamePasswordToken(user.getUserName(),DigestUtils.md5Hex(user.getUserName()).toCharArray());
            // 默认设置为记住密码,你可以自己在表单中加一个参数来控制
            token.setRememberMe(true);
            try {
                userShiro.login(token);
                return "success!";
            } catch (UnknownAccountException e) {
                throw new RuntimeException("账号不存在!", e);
            } catch (DisabledAccountException e) {
                throw new RuntimeException("账号未启用!", e);
            } catch (IncorrectCredentialsException e) {
                throw new RuntimeException("密码错误!", e);
            } catch (Throwable e) {
                throw new RuntimeException("未知错误,请联系管理员!", e);
            }
    
        }
        /**
         * 注册
         * @return
         */
        @RequestMapping(value = "/register", method = {RequestMethod.POST})
        @ResponseBody
        public String register(User user) {
            System.out.println(user);
            try {
             int issuccess= userSerivce.saveUser(user);
                return "success!";
            } catch (Exception e) {
                return "fail!";
            }
        }
        /**
         * 字段管理页
         *
         * @return
         */
        @RequestMapping(value = "/manager", method = {RequestMethod.GET})
        public String manager() {
            return "success";
        }
    
        @RequestMapping(value = "/dataGrid", method = {RequestMethod.GET})
        public Object dataGrid(Integer page, Integer rows, String sort, String order) {
            return "success";
        }
    
        @RequestMapping(value = "/addPage", method = {RequestMethod.GET})
        public String addPage() {
            return "success";
        }
    
        /**
         * 添加字段
         *
         * @return
         */
        @RequestMapping(value = "/add", method = {RequestMethod.GET})
        public Object add() {
                return "success";
        }
        /**
         * 未授权
         * @return {String}
         */
        @RequestMapping(value = "/unauth", method = {RequestMethod.GET})
        public String unauth() {
            if (SecurityUtils.getSubject().isAuthenticated() == false) {
                return "redirect:/login";
            }
            return "unauth";
        }
        /**
         * 退出
         * @return {Result}
         */
        @RequestMapping(value = "/logout", method = {RequestMethod.GET})
        public Object logout() {
            Subject subject = SecurityUtils.getSubject();
            subject.logout();
            return "login";
        }
    }
    View Code

    以上就是所有的配置信息了,面来给出测试页面:

    11.login.jsp

    <%--
      Created by IntelliJ IDEA.
      User: 杨永生
      Date: 2017/9/4
      Time: 10:13
      To change this template use File | Settings | File Templates.
    --%>
    <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
    <html>
    <head>
        <title>index</title>
    </head>
    <body>
    <h1>login</h1>
    <form action="/register" method="post">
        <input type="text" name="userName" value="admin2">
        <input type="text" name="password" value="admin">
        <button type="submit">register</button>
    </form>
    <form action="/login" method="get">
        <input type="text" name="userName" value="admin">
        <input type="text" name="password" value="admin">
        <button type="submit">login</button>
    </form>
    <form action="/login" method="post">
        <input type="text" name="userName" value="admin">
        <input type="text" name="password" value="admin">
        <button type="submit">login</button>
    </form>
    </body>
    </html>
    View Code

    12.success.jsp

    <%--
      Created by IntelliJ IDEA.
      User: 杨永生
      Date: 2017/9/4
      Time: 10:13
      To change this template use File | Settings | File Templates.
    --%>
    <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
    <html>
    <head>
        <title>index</title>
    </head>
    <body>
    <h1>访问成功</h1>
    </body>
    </html>
    View Code

    13.unauth.jsp:暂时没有实现未授权跳转

    <%--
      Created by IntelliJ IDEA.
      User: 杨永生
      Date: 2017/9/4
      Time: 10:13
      To change this template use File | Settings | File Templates.
    --%>
    <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
    <html>
    <head>
        <title>index</title>
    </head>
    <body>
    <h1>未授权</h1>
    
    </body>
    </html>
    View Code

    14.index.jsp

    <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
    <%--
      Created by IntelliJ IDEA.
      User: 杨永生
      Date: 2017/9/4
      Time: 10:13
      To change this template use File | Settings | File Templates.
    --%>
    <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
    <html>
    <head>
        <title>index</title>
    </head>
    <body>
    <h1>index</h1>
    <shiro:hasPermission name="/logout">
        <a href="/logout">logout</a>
    </shiro:hasPermission><shiro:hasPermission name="/addPage">
        <a href="/addPage">addPage</a>
    </shiro:hasPermission><shiro:hasPermission name="/add">
        <a href="/add">add</a>
    </shiro:hasPermission><shiro:hasPermission name="/manager">
        <a href="/manager">manager</a>
    </shiro:hasPermission><shiro:hasPermission name="/dataGrid">
        <a href="/dataGrid">dataGrid</a>
    </shiro:hasPermission>
    
    
    登陆名称
    <shiro:principal></shiro:principal>
    
    <shiro:hasRole name="admin">
        <br><br>
        <a href="admin.jsp">Admin Page</a>
    </shiro:hasRole>
    
    <shiro:hasRole name="user">
        <br><br>
        <a href="user.jsp">User Page</a>
    </shiro:hasRole>
    </body>
    </html>
    View Code

    实体类的数据库增删改查文件太多, 这里就不展示了,下面给出ShiroDbRealm.java中三个service查询的数据

    User{userId=1, userName='admin', password='21232f297a57a5a743894a0e4a801fc3'}

    roleList={1}

    上面的密码是加密的,因此要有加密工具:

    15.DigestUtils.java

    package com.yys.common.util;
    
    import org.apache.commons.io.Charsets;
    /**
     * User: 杨永生
     * Date: 10:08 2017/9/4
     * Email: 1095737364@qq.com
     */
    public class DigestUtils extends org.springframework.util.DigestUtils {
    
        public static String md5Hex(final String data) {
            return DigestUtils.md5DigestAsHex(data.getBytes(Charsets.UTF_8));
        }
    
        public static String md5Hex(final byte[] bytes) {
            return DigestUtils.md5DigestAsHex(bytes);
        }
    }
    View Code

    16.StringUtils.java

    package com.yys.common.util;
    
    import java.util.Collection;
    
    /**
     * User: 杨永生
     * Date: 10:08 2017/9/4
     * Email: 1095737364@qq.com
     */
    public final class StringUtils {
        private StringUtils() {
        }
        public static String join(Object[] array, String sep) {
            return join((Object[])array, sep, (String)null);
        }
    
        public static String join(Collection list, String sep) {
            return join((Collection)list, sep, (String)null);
        }
    
        public static String join(Collection list, String sep, String prefix) {
            Object[] array = list == null?null:list.toArray();
            return join(array, sep, prefix);
        }
    
        public static String join(Object[] array, String sep, String prefix) {
            if(array == null) {
                return "";
            } else {
                int arraySize = array.length;
                if(arraySize == 0) {
                    return "";
                } else {
                    if(sep == null) {
                        sep = "";
                    }
    
                    if(prefix == null) {
                        prefix = "";
                    }
    
                    StringBuilder buf = new StringBuilder(prefix);
    
                    for(int i = 0; i < arraySize; ++i) {
                        if(i > 0) {
                            buf.append(sep);
                        }
    
                        buf.append(array[i] == null?"":array[i]);
                    }
    
                    return buf.toString();
                }
            }
        }
    
        public static String jsonJoin(String[] array) {
            int arraySize = array.length;
            int bufSize = arraySize * (array[0].length() + 3);
            StringBuilder buf = new StringBuilder(bufSize);
    
            for(int i = 0; i < arraySize; ++i) {
                if(i > 0) {
                    buf.append(',');
                }
    
                buf.append('"');
                buf.append(array[i]);
                buf.append('"');
            }
    
            return buf.toString();
        }
    
        /**
         * 判断 Object 是否时空
         * @param s
         * @return
         */
        public static boolean isNullOrEmpty(Object s) {
            return org.springframework.util.StringUtils.isEmpty(s);
        }
    
        /**
         * 判断是否是字符串数组
         * @param s
         * @param array
         * @return
         */
        public static boolean inStringArray(String s, String[] array) {
            String[] var2 = array;
            int var3 = array.length;
            for(int var4 = 0; var4 < var3; ++var4) {
                String x = var2[var4];
                if(x.equals(s)) {
                    return true;
                }
            }
            return false;
        }
    }
    View Code

    下面是一个成功事例的页面:

    需要源代码的同学, 可以加群,共同学习!!

  • 相关阅读:
    hdu 1142 用优先队列实现Dijkstra
    POJ 2063 Investment 完全背包
    POJ 3260 多重背包+完全背包
    bignum 大数模板
    POJ 3468(树状数组的威力)
    POJ 3468 线段树裸题
    hdu 1058 Humble Numbers
    CodeForces 185A 快速幂
    POJ 1990 MooFest 树状数组
    设计模式(20)策略模式
  • 原文地址:https://www.cnblogs.com/yysbolg/p/7479060.html
Copyright © 2011-2022 走看看