Blog shiro 配置

    <!-- Shiro过滤器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
        <!-- Shiro的核心安全接口,这个属性是必须的 -->  
        <property name="securityManager" ref="securityManager"/>
        <!-- 身份认证失败,则跳转到登录页面的配置 -->  
        <property name="loginUrl" value="/login.jsp"/> 
        <!-- Shiro连接约束配置,即过滤链的定义 -->  
        <property name="filterChainDefinitions">  
            <value>
                /login=anon
                /admin/**=authc
            </value>  
        </property>
    </bean>  
  <!-- shiro过滤器定义 -->
    <filter>  
        <filter-name>shiroFilter</filter-name>  
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
    <init-param>  
    <!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 -->  
    <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>
    
web.xml
 /login=anon  表示/login请求不拦截,感觉这里写的有点问题,因为登录请求是/blogger/login.do, 登录页面login.jsp写在webapp下面都不会不拦截(如果你把jsp页面放在WEB-INF下面就不能通过浏览器访问了,
只能是通过servlet跳转页面),但是webapp文件夹下面的amin文件夹都会拦截
因为你的请求路径是${web}/admin/**. (所以,拦截主要还是看你的浏览器地址栏写的请求路径) /admin/**=authc 表示需要通过权限认证才能访问, 自定义ream 可以设置当前登录用户的角色和权限。 web.xml配置表示过滤所以请求。
    @RequestMapping("/login")
    public String login(Blogger blogger,HttpServletRequest request){
        Subject subject=SecurityUtils.getSubject();
        UsernamePasswordToken token=new UsernamePasswordToken(blogger.getUserName(), CryptographyUtil.md5(blogger.getPassword(), "java1234"));
        try{
            subject.login(token); // 登录验证        
            return "redirect:/admin/main.jsp";
        }catch(Exception e){
            e.printStackTrace();
            request.setAttribute("blogger", blogger);
            request.setAttribute("errorInfo", "用户名或者密码错误!");
            return "login";
        }
    }

登录请求的 subject.login(token);会跳到自定义ream去验证页面输入的用户名和密码是否和数据库中的匹配。

    /**
     * 验证当前登录的用户
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String userName=(String) token.getPrincipal();
        Blogger blogger=bloggerService.getByUserName(userName);
        if(blogger!=null){
            SecurityUtils.getSubject().getSession().setAttribute("currentUser", blogger); // 把当前用户信息存到session中
            //验证用户名和密码,第3个参数没用,随便写的。
            AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(blogger.getUserName(), blogger.getPassword(), "xxx");
            return authcInfo;
        }else{
            return null;            
        }
    }

 

posted @ 2016-12-11 12:50  SKYisLimit  阅读(166)  评论(0)    收藏  举报