[关闭]
@chenbinghua 2019-03-02T06:38:03.000000Z 字数 3094 阅读 711

SpringBoot(第篇):整合Shiro(二)整合

SpringBoot


紧着上一小节,在上一节我们编写了简单的一个小程序,但是我们会发现我们随便访问index,login 以及任何一个界面,无需登录也可以进行访问,但是这不是我们所想要的,我们想要的是希望在用户没有登录的情况下,跳转login页面进行登录。那么这个时候Shiro就闪亮登场了。

集成shiro大概分这么一个步骤:

  1. pom.xml中添加Shiro依赖;
  2. 注入Shiro Factory和SecurityManager。
  3. 身份认证
  4. 权限控制

引入依赖

  1. <dependency>
  2. <groupId>org.apache.shiro</groupId>
  3. <artifactId>shiro-spring</artifactId>
  4. <version>1.2.2</version>
  5. </dependency>

注入Shiro Factory和SecurityManager

  1. package com.chen.springbootshiro.configuration;
  2. import java.util.LinkedHashMap;
  3. import java.util.Map;
  4. import org.apache.shiro.mgt.SecurityManager;
  5. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  6. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. /**
  10. * Shiro 配置
  11. *
  12. Apache Shiro 核心通过 Filter 来实现,就好像SpringMvc 通过DispachServlet 来主控制一样。
  13. 既然是使用 Filter 一般也就能猜到,是通过URL规则来进行过滤和权限校验,所以我们需要定义一系列关于URL的规则和访问权限。
  14. *
  15. * @author Angel(QQ:412887952)
  16. * @version v.0.1
  17. */
  18. @Configuration
  19. public class ShiroConfiguration {
  20. /**
  21. * ShiroFilterFactoryBean 处理拦截资源文件问题。
  22. * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,以为在
  23. * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
  24. *
  25. Filter Chain定义说明
  26. 1、一个URL可以配置多个Filter,使用逗号分隔
  27. 2、当设置多个过滤器时,全部验证通过,才视为通过
  28. 3、部分过滤器可指定参数,如perms,roles
  29. *
  30. */
  31. @Bean
  32. public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){
  33. System.out.println("ShiroConfiguration.shirFilter()");
  34. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  35. // 必须设置 SecurityManager
  36. shiroFilterFactoryBean.setSecurityManager(securityManager);
  37. //拦截器.
  38. Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
  39. //配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了
  40. filterChainDefinitionMap.put("/logout", "logout");
  41. //<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
  42. //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
  43. filterChainDefinitionMap.put("/**", "authc");
  44. // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
  45. shiroFilterFactoryBean.setLoginUrl("/login");
  46. // 登录成功后要跳转的链接
  47. shiroFilterFactoryBean.setSuccessUrl("/index");
  48. //未授权界面;
  49. shiroFilterFactoryBean.setUnauthorizedUrl("/403");
  50. shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
  51. return shiroFilterFactoryBean;
  52. }
  53. @Bean
  54. public SecurityManager securityManager(){
  55. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  56. securityManager.setRealm(userRealm());
  57. return securityManager;
  58. }
  59. @Bean
  60. public UserRealm userRealm() {
  61. UserRealm userRealm = new UserRealm();
  62. return userRealm;
  63. }
  64. }
  1. /**
  2. * 身份认证,简单来说就是授权
  3. * @return
  4. * @throws AuthenticationException
  5. */
  6. @Override
  7. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  8. String username = (String)token.getPrincipal();
  9. // 假设只有一个用户 zhangsan 666
  10. if (!username.equals("zhangsan")){
  11. return null;
  12. }
  13. // 模拟从数据库查到密码是666
  14. String password = "666";
  15. SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,password,getName());
  16. return info;
  17. }
  18. /**
  19. * 给当前用户授权
  20. * @param
  21. * @return
  22. */
  23. @Override
  24. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
  25. return null;
  26. }
  27. }

到此,当我们访问/index页面的时候,系统就会帮我们重定向到/login页面。

因为我们在上面的配置类中定义了所有的url都不允许匿名访问。匿名访问就重定向到/login登陆页。

在登陆页面输入账号密码zhangsan 666的时候,我们就能跳转到/index页面了。以上只是简单的身份认证。

在下一章的内容,我们就开始做授权内容。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注