shiro与spring整合

红太狼 2023-06-26 12:16 140阅读 0赞

文章目录

    • 首先需要一个简单的ssm项目:
      • pom配置
      • web.xml配置
      • spring.xml配置
      • 自定义realm
    • 简单测试
    • 通过java配置的方式整合spring

首先需要一个简单的ssm项目:

简单的ssm项目

pom配置

在项目pom.xml里面加入shiro依赖:

  1. <properties>
  2. <shiro.version>1.4.2</shiro.version>
  3. </properties>
  4. <dependency>
  5. <groupId>org.apache.shiro</groupId>
  6. <artifactId>shiro-core</artifactId>
  7. <version>${ shiro.version}</version>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.apache.shiro</groupId>
  11. <artifactId>shiro-web</artifactId>
  12. <version>${ shiro.version}</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.apache.shiro</groupId>
  16. <artifactId>shiro-spring</artifactId>
  17. <version>${ shiro.version}</version>
  18. </dependency>

web.xml配置

web.xml加入shiro过滤器:

  1. <!--shiro过滤器-->
  2. <filter>
  3. <filter-name>shiroFilter</filter-name>
  4. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  5. <init-param>
  6. <param-name>targetFilterLifecycle</param-name>
  7. <param-value>true</param-value>
  8. </init-param>
  9. </filter>
  10. <filter-mapping>
  11. <filter-name>shiroFilter</filter-name>
  12. <url-pattern>/*</url-pattern> </filter-mapping>

这里的filter-name的值shiroFilter需要跟spring里面配置的filter一样.

spring.xml配置

首先了解一下:

创建spring-shiro.xml配置:
首先肯定需要配置shiro的拦截过滤器bean,这个类org.apache.shiro.spring.web.ShiroFilterFactoryBean;
在这里插入图片描述
ShiroFilterFactoryBean里面的loginUrl,successUrl,unauthorizedUrl大致如下:
在这里插入图片描述
这个类的属性有SecurityManager,配置SecurityManager就使用默认的就好了,而默认的org.apache.shiro.web.mgt.DefaultWebSecurityManager有个传realm的构造方法.
在这里插入图片描述
配置文件需要在spring配置文件里面引入的:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <bean name="shiroFilterBean" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  6. <property name="securityManager" ref="securityManager"></property>
  7. <property name="filterChainDefinitions">
  8. <value>
  9. /login = anon
  10. /logout = logout
  11. /** = authc </value> </property> <property name="loginUrl" value="/login" /> <property name="successUrl" value="/index" /> </bean> <bean name="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realms" ref="shiroRealm"></property> </bean> <bean name="shiroRealm" class="com.txn.config.ShiroRealm"> <!-- <property name="credentialsMatcher"> <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <property name="hashAlgorithmName" value="md5"></property> <property name="hashIterations" value="1"></property> </bean> </property>--> </property> </bean> </beans>

自定义realm

我们自己实现一个realm,上篇讲了,自己实现realm只需要继承AuthorizingRealm就可以了,看一下三篇讲的sampleRealm的rml图:装饰者应该
在这里插入图片描述

  1. import org.apache.shiro.authc.AuthenticationException;
  2. import org.apache.shiro.authc.AuthenticationInfo;
  3. import org.apache.shiro.authc.AuthenticationToken;
  4. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  5. import org.apache.shiro.authz.AuthorizationInfo;
  6. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  7. import org.apache.shiro.realm.AuthorizingRealm;
  8. import org.apache.shiro.subject.PrincipalCollection;
  9. import org.apache.shiro.util.ByteSource;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. public class ShiroRealm extends AuthorizingRealm {
  13. /** * 认证 */
  14. @Override
  15. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  16. System.out.println("-权限校验-");
  17. if ("admin".equals(token.getPrincipal())) {
  18. Map<String, Object> user = new HashMap<>();
  19. user.put("username", "admin");
  20. user.put("pass", "admin");
  21. user.put("user_id", 1);
  22. ByteSource salt = ByteSource.Util.bytes("abcd123");
  23. return new SimpleAuthenticationInfo(user, user.get("username"), salt, this.getName());
  24. }
  25. return null;
  26. }
  27. /** * 授权 */
  28. @Override
  29. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
  30. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
  31. info.addRole("role_admin");
  32. info.addStringPermission("user:add");
  33. info.addStringPermission("user:list");
  34. return info;
  35. }
  36. }

简单测试

随便写个controller:

  1. import com.txn.common.ResponseObject;
  2. import org.apache.shiro.SecurityUtils;
  3. import org.apache.shiro.authc.UsernamePasswordToken;
  4. import org.apache.shiro.subject.Subject;
  5. import org.springframework.util.StringUtils;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestMethod;
  8. import org.springframework.web.bind.annotation.RestController;
  9. /** * @author <a href="mailto:15268179013@139.com">yida</a> * @Version 2020-01-01 15:42 * @Version 1.0 * @Description IndexController */
  10. @RestController
  11. public class IndexController {
  12. @RequestMapping(value = "/login", method = { RequestMethod.POST, RequestMethod.GET})
  13. public ResponseObject login(String username, String password) {
  14. ResponseObject responseObject = new ResponseObject();
  15. if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
  16. responseObject.success("登录失败");
  17. return responseObject;
  18. }
  19. UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
  20. SecurityUtils.getSubject().login(usernamePasswordToken);
  21. responseObject.success("ok");
  22. return responseObject;
  23. }
  24. @RequestMapping(value = "/getUser", method = RequestMethod.GET)
  25. public ResponseObject getUser() {
  26. ResponseObject responseObject = new ResponseObject();
  27. responseObject.success(true);
  28. return responseObject;
  29. }
  30. @RequestMapping(value = "/user", method = RequestMethod.GET)
  31. public ResponseObject user() {
  32. ResponseObject responseObject = new ResponseObject();
  33. Subject subject = SecurityUtils.getSubject();
  34. boolean permitted = subject.isPermitted("user:list");
  35. responseObject.success(permitted);
  36. return responseObject;
  37. }
  38. }

就没写页面了,随便测试一下:
首先访问:http://localhost:8080/getUser,会跳转到登录页面,因为我们没有登录;
然后进行登录:http://localhost:8080/login?username=admin&password=admin
在这里插入图片描述
然后在访问http://localhost:8080/getUser但是并不会进入授权方法,就是doGetAuthorizationInfo方法,
然后访问http://localhost:8080/user然后在调用isPermitted方法的时候就进入到了doGetAuthorizationInfo方法证明了我们上篇介绍的.

通过java配置的方式整合spring

前面是通过xml的方式,改成通过配置类的方式:

  1. import org.apache.shiro.realm.Realm;
  2. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  3. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. /** * @author <a href="mailto:15268179013@139.com">yida</a> * @Version 2020-01-01 15:05 * @Version 1.0 * @Description ShiroConfig */
  7. @Configuration
  8. public class ShiroConfig {
  9. @Bean
  10. public DefaultWebSecurityManager securityManager() {
  11. DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
  12. defaultWebSecurityManager.setRealm(realm());
  13. return defaultWebSecurityManager;
  14. }
  15. @Bean
  16. public Realm realm() {
  17. ShiroRealm shiroRealm = new ShiroRealm();
  18. return shiroRealm;
  19. }
  20. @Bean
  21. public ShiroFilterFactoryBean shiroFilter() {
  22. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  23. shiroFilterFactoryBean.setSecurityManager(securityManager());
  24. shiroFilterFactoryBean.setLoginUrl("/login");
  25. shiroFilterFactoryBean.setSuccessUrl("/index");
  26. shiroFilterFactoryBean.setFilterChainDefinitions(" /login = anon\n" +
  27. " /logout = logout\n" +
  28. " /** = authc");
  29. return shiroFilterFactoryBean;
  30. }
  31. }

发表评论

表情:
评论列表 (有 0 条评论,140人围观)

还没有评论,来说两句吧...

相关阅读