zoukankan      html  css  js  c++  java
  • shiro 之 认证登录的demo——转载

    1 shiro登录的简单demo

    1.1 web.xml添加shiroFilter

    <!-- shiro过虑器,DelegatingFilterProx会从spring容器中找shiroFilter -->

           <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>

           </filter>

           <filter-mapping>

                  <filter-name>shiroFilter</filter-name>

                  <url-pattern>/*</url-pattern>

           </filter-mapping>

    1.2 applicationContext-shiro.xml

    <!-- Shiro 的Web过滤器 -->

           <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

                  <property name="securityManager" ref="securityManager" />

                  <!-- 如果没有认证将要跳转的登陆地址,http可访问的url,如果不在表单认证过虑器FormAuthenticationFilter中指定此地址就为身份认证地址 -->

                  <property name="loginUrl" value="/login.action" />

    <!-- 没有权限跳转的地址 -->

                  <property name="unauthorizedUrl" value="/refuse.jsp" />

    <!-- shiro拦截器配置 -->

                  <property name="filters">

                         <map>

                                <entry key="authc" value-ref="formAuthenticationFilter" />

                         </map>

                  </property>

                  <property name="filterChainDefinitions">

                         <value>

                                <!-- 必须通过身份认证方可访问,身份认 证的url必须和过虑器中指定的loginUrl一致 -->

                                /loginsubmit.action = authc

                                <!-- 退出拦截,请求logout.action执行退出操作 -->

                                /logout.action = logout

                                <!-- 无权访问页面 -->

                                /refuse.jsp = anon

                                <!-- roles[XX]表示有XX角色才可访问 -->

                                /item/list.action = roles[item],authc

                                /js/** anon

                                /images/** anon

                                /styles/** anon

                                <!-- user表示身份认证通过或通过记住我认证通过的可以访问 -->

                                /** = user

                                <!-- /**放在最下边,如果一个url有多个过虑器则多个过虑器中间用逗号分隔,如:/** = user,roles[admin] -->

                         </value>

                  </property>

           </bean>

           <!-- 安全管理器 -->

           <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

                  <property name="realm" ref="userRealm" />

                 

           </bean>

           <!-- 自定义 realm -->

           <bean id="userRealm" class="cn.itcast.ssm.realm.CustomRealm1">

           </bean>

           <!-- 基于Form表单的身份验证过滤器,不配置将也会注册此过虑器,表单中的用户账号、密码及loginurl将采用默认值,建议配置 -->

           <bean id="formAuthenticationFilter"

                  class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">

                  <!-- 表单中账号的input名称 -->

                  <property name="usernameParam" value="usercode" />

                  <!-- 表单中密码的input名称 -->

                  <property name="passwordParam" value="password" />

                  <!-- <property name="rememberMeParam" value="rememberMe"/> -->

                  <!-- loginurl:用户登陆地址,此地址是可以http访问的url地址 -->

                  <property name="loginUrl" value="/loginsubmit.action" />

           </bean>

    securitymanager:这个属性是必须的

    loginUrl:没有登录认证的用户请求将跳转到此地址,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的“/login.jsp”页面

    unanthorizedUrl:没有权限默认跳转的页面

    1.3 使用shiro注解授权

    在springmvc.xml中配置shiro注解支持,可在controller方法中使用shiro注解配置权限:

    <!-- 开启aop,对类代理 -->

           <aop:config proxy-target-class="true"></aop:config>

           <!-- 开启shiro注解支持 -->

           <bean

                  class="

    org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">

                  <property name="securityManager" ref="securityManager" />

           </bean>

    修改Controller代码,在方法上添加授权注解,如下:

    // 查询商品列表

           @RequestMapping("/queryItem")

           @RequiresPermissions("item:query")

           public ModelAndView queryItem() throws Exception {

    上边代码@RequiresPermissions(“item:query”)表示必须拥有“item:query”权限方可执行。

    1.4 退出

    由于使用shiro的sessionManager,不用开发退出功能,使用shiro的logout拦截器即可。

    <!-- 退出拦截,请求logout.action执行退出操作 -->

    /logout.action = logout

    1.5 缓存

        shiro每个授权都会通过realm获取权限信息,为了提高访问速度需要添加缓存,第一次从realm中读取权限数据,之后不再读取,这里Shiro和Ehcache整合。

    1.5.1 配置

        在applicationContext-shiro.xml中配置缓存管理器

    <!-- 安全管理器 -->

           <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

                  <property name="realm" ref="userRealm" />

                  <property name="sessionManager" ref="sessionManager" />

                  <property name="cacheManager" ref="cacheManager"/>

           </bean>

    <!-- 缓存管理器 -->

        <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">

        </bean>

    1.5.2 session管理

    在applicationContext-shiro.xml中配置sessionManager:

    <!-- 安全管理器 -->

           <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

                  <property name="realm" ref="userRealm" />

                  <property name="sessionManager" ref="sessionManager" />

           </bean>

    <!-- 会话管理器 -->

        <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">

            <!-- session的失效时长,单位毫秒 -->

            <property name="globalSessionTimeout" value="600000"/>

            <!-- 删除失效的session -->

            <property name="deleteInvalidSessions" value="true"/>

        </bean>

    1.6 验证码

    需要在验证账号和名称之前校验验证码。

    public class MyFormAuthenticationFilter extends FormAuthenticationFilter {

           protected boolean onAccessDenied(ServletRequest request,

                         ServletResponse response, Object mappedValue) throws Exception {

                  // 校验验证码

                  // 从session获取正确的验证码

                  HttpSession session = ((HttpServletRequest)request).getSession();

                  //页面输入的验证码

                  String randomcode = request.getParameter("randomcode");

                  //从session中取出验证码

                  String validateCode = (String) session.getAttribute("validateCode");

                  if (!randomcode.equals(validateCode)) {

                         // randomCodeError表示验证码错误

                         request.setAttribute("shiroLoginFailure", "randomCodeError");

                         //拒绝访问,不再校验账号和密码

                         return true;

                  }

                 

                  return super.onAccessDenied(request, response, mappedValue);

           }

    }

    修改applicationContext-shiro.xml中对FormAuthenticationFilter的配置。

    <bean id="formAuthenticationFilter"

                  class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">

    改为

                 

    <bean id="formAuthenticationFilter"

                  class="cn.itcast.ssm.shiro.MyFormAuthenticationFilter">

    1.7 记住我

        用户登录选择“自动登录”本次登录成功会向cookie写身份信息,下次登录从cookie中取出身份信息实现自动登录。

        向cookie记录身份信息需要用户身份信息对象实现序列化接口。

    1.7.1 配置

        <!-- 安全管理器 -->

           <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

                  <property name="realm" ref="userRealm" />

                  <property name="sessionManager" ref="sessionManager" />

                  <property name="cacheManager" ref="cacheManager"/>

                  <!-- 记住我 -->

                  <property name="rememberMeManager" ref="rememberMeManager"/>

           </bean>

    <!-- rememberMeManager管理器 -->

           <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">

                  <property name="cookie" ref="rememberMeCookie" />

           </bean>

           <!-- 记住我cookie -->

           <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">

                  <constructor-arg value="rememberMe" />

                  <!-- 记住我cookie生效时间30天 -->

                  <property name="maxAge" value="2592000" />

           </bean>

    修改formAuthenticationFitler添加页面中“记住我checkbox”的input名称:

    <bean id="formAuthenticationFilter"

                  class="cn.itcast.ssm.shiro.MyFormAuthenticationFilter">

                  <!-- 表单中账号的input名称 -->

                  <property name="usernameParam" value="usercode" />

                  <!-- 表单中密码的input名称 -->

                  <property name="passwordParam" value="password" />

                  <property name="rememberMeParam" value="rememberMe"/>

                  <!-- loginurl:用户登陆地址,此地址是可以http访问的url地址 -->

                  <property name="loginUrl" value="/loginsubmit.action" />

           </bean>

  • 相关阅读:
    nginx+iis使用
    sqlserver中一些常用的函数总结
    HTML如何让文字居中?附两种方式
    PNG图片收集
    解决mac pro 软件损坏
    end-of-file from the keyboard
    c++while控制语句
    如何通过命令行编写调试第一个C++程序(UNIX)
    matlab直接运行fig文件时报错
    第二次结对编程作业
  • 原文地址:https://www.cnblogs.com/lonely-buffoon/p/5581514.html
Copyright © 2011-2022 走看看