@chenbinghua
2019-03-01T22:38:03.000000Z
字数 3094
阅读 916
SpringBoot
紧着上一小节,在上一节我们编写了简单的一个小程序,但是我们会发现我们随便访问index,login 以及任何一个界面,无需登录也可以进行访问,但是这不是我们所想要的,我们想要的是希望在用户没有登录的情况下,跳转login页面进行登录。那么这个时候Shiro就闪亮登场了。
集成shiro大概分这么一个步骤:
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.2.2</version></dependency>
package com.chen.springbootshiro.configuration;import java.util.LinkedHashMap;import java.util.Map;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/*** Shiro 配置*Apache Shiro 核心通过 Filter 来实现,就好像SpringMvc 通过DispachServlet 来主控制一样。既然是使用 Filter 一般也就能猜到,是通过URL规则来进行过滤和权限校验,所以我们需要定义一系列关于URL的规则和访问权限。** @author Angel(QQ:412887952)* @version v.0.1*/@Configurationpublic class ShiroConfiguration {/*** ShiroFilterFactoryBean 处理拦截资源文件问题。* 注意:单独一个ShiroFilterFactoryBean配置是或报错的,以为在* 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager*Filter Chain定义说明1、一个URL可以配置多个Filter,使用逗号分隔2、当设置多个过滤器时,全部验证通过,才视为通过3、部分过滤器可指定参数,如perms,roles**/@Beanpublic ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){System.out.println("ShiroConfiguration.shirFilter()");ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();// 必须设置 SecurityManagershiroFilterFactoryBean.setSecurityManager(securityManager);//拦截器.Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();//配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了filterChainDefinitionMap.put("/logout", "logout");//<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;//<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->filterChainDefinitionMap.put("/**", "authc");// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面shiroFilterFactoryBean.setLoginUrl("/login");// 登录成功后要跳转的链接shiroFilterFactoryBean.setSuccessUrl("/index");//未授权界面;shiroFilterFactoryBean.setUnauthorizedUrl("/403");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;}@Beanpublic SecurityManager securityManager(){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(userRealm());return securityManager;}@Beanpublic UserRealm userRealm() {UserRealm userRealm = new UserRealm();return userRealm;}}
/*** 身份认证,简单来说就是授权* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String username = (String)token.getPrincipal();// 假设只有一个用户 zhangsan 666if (!username.equals("zhangsan")){return null;}// 模拟从数据库查到密码是666String password = "666";SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,password,getName());return info;}/*** 给当前用户授权* @param* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {return null;}}
到此,当我们访问/index页面的时候,系统就会帮我们重定向到/login页面。
因为我们在上面的配置类中定义了所有的url都不允许匿名访问。匿名访问就重定向到/login登陆页。
在登陆页面输入账号密码zhangsan 666的时候,我们就能跳转到/index页面了。以上只是简单的身份认证。
在下一章的内容,我们就开始做授权内容。