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>
/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; } }