发表于: 2018-09-10 23:32:05

1 509


今天完成的事情

今天主要是学习了一波shiro,因为后台管理认证不是我写的,所以去看一下,


package com.example.demo.Config;

import com.example.demo.pojo.SysPermission;
import com.example.demo.pojo.SysRole;
import com.example.demo.pojo.UserInfo;
import com.example.demo.service.UserInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

import javax.annotation.Resource;

/**
* @author lixiaobai
* @program: demo
* @create: 2018-09-10 16:46
*/
@Slf4j
public class MyShiroRealm extends AuthorizingRealm {
   @Resource
private UserInfoService userInfoService;

   /**
    * 链接权限的实现
    * @param principalCollection
    * @return
*/
   @Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
       System.out.println("权限配置 --> MyShiroRealm.doGetAuthorizationInfo()");
       SimpleAuthorizationInfo authenticationInfo = new SimpleAuthorizationInfo();
       UserInfo userInfo = (UserInfo)principalCollection.getPrimaryPrincipal();
       for (SysRole role:userInfo.getRoleList()){
           authenticationInfo.addRole(role.getRole());
           for (SysPermission p:role.getPermissions()){
               authenticationInfo.addStringPermission(p.getPermission());
           }
       }
       return authenticationInfo;
   }

   @Override
   protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
           System.out.println("MyShiroRealm.doGetAuthenticationInfo()");
           //获取用户的输入账号
           String username = (String)authenticationToken.getPrincipal();
           System.out.println(authenticationToken.getCredentials());
           //通过username从数据库中查找 User对象,如果找到,没找到.
           //实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
           UserInfo userInfo = userInfoService.findByUserName(username);
           System.out.println("------>>userInfo=" + userInfo);
           if (userInfo == null){
               return null;
           }
           SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
                   userInfo, //用户名
                   userInfo.getPassword(), //密码
                   ByteSource.Util.bytes(userInfo.getCredentialsSalt()),//salt=username+salt
                   getName()  //realm name
           );
       log.info("authenticationInfo.getCredentialsSalt(): " + authenticationInfo.getCredentialsSalt() + "authenticationInfo.getCredentials(): " + authenticationInfo.getCredentials() + authenticationInfo.getPrincipals());
       return authenticationInfo;
       }
   }

shiroconfig

package com.example.demo.Config;

import lombok.extern.slf4j.Slf4j;
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;

import java.util.LinkedHashMap;
import java.util.Map;

/**
* @author lixiaobai
* @program: demo
* @create: 2018-09-10 16:31
*/
@Configuration
@Slf4j
public class ShiroConfig {
   @Bean
   public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
       System.out.println("ShiroConfiguration.shirFilter()");
       ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
       shiroFilterFactoryBean.setSecurityManager(securityManager);
       //拦截器
       Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
       //配置不会被拦截的链接,顺序判断
       filterChainDefinitionMap.put("/static/**","anon");
       //配置退出过滤器 其中的具体退出代码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;
   }
   @Bean
   public MyShiroRealm myShiroRealm(){
       MyShiroRealm myShiroRealm = new MyShiroRealm();
       return myShiroRealm;
   }


   @Bean
   public SecurityManager securityManager(){
       DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();
       securityManager.setRealm(myShiroRealm());
       return securityManager;
   }
}


实体类


配置文件

spring:
 datasource:
   url: jdbc:mysql://localhost:3306/test
username: root
password: 123
driver-class-name: com.mysql.jdbc.Driver
jpa:
   database: mysql
show-sql: true
hibernate:
     ddl-auto: update
naming:
       strategy: org.hibernate.cfg.DefaultComponentSafeNamingStrategy
properties:
     hibernate:
       dialect: org.hibernate.dialect.MySQL5Dialect
#thymeleaf��������Ϊ��ȥ��html��У��
 thymeleaf:
   cache: false
mode: LEGACYHTML5


权限网页

明天计划的事情

继续学习这个shiro,现在看的有点懵。

遇到的问题

已解决

学习的内容

未解决

学习的内容

收获

shiro初识。



返回列表 返回列表
评论

    分享到