发表于: 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初识。
评论