Shiro讲解与实践
- 下载本文的shiro实战完整代码链接:https://download.csdn.net/download/shooter7/37712708
说明
shiro讲解与实践,主要用于实现以下的功能:
- 用户认证、授权
- 权限限制
- 记住我、首页定制
- 登录拦截
- 整合Mybatis
- 整合Thymeleaf
shiro
1.1 什么是shiro?
- Apache shiro 是一个Java的安全(权限)框架。
- shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE的环境
- shiro可以完成,认证、授权、加密、会话管理、web集成、缓存等功能
- 下载网站:http://shiro.apache.org/
1.2 有哪些功能呢?
- Cryptography:加密,保护数据的安全性,如密码加密存储到数据库中,而不是明文存储
- Concurrency:Shiro支持多线程应用的并发验证,即:如在一个线程中开启另一个线程,能把权限自动传播过去
- Run As:允许一个用户伪装成另外一个用户的身份进行访问
1.3 shiro架构(外部)
从外部来看Shiro,即从应用程序的角度来观察如何使用shiro完成工作:
1.4 shiro内部架构
- 导入shiro的整合依赖
- 编写shiro的两个核心配置,一个是ShiroConfig 一个是UserRealm(用户认证的授权登录)
两个核心控制类的代码
- Userrealm
public class UserRealm extends AuthorizingRealm {
@Autowired
UserService userService;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了=>授权doGetAuthorizationInfo");
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//拿到当前登录的这个对象
Subject subject = SecurityUtils.getSubject();
User currentUser = (User)subject.getPrincipal();//拿到user对象了
//设置当前用户的权限
info.addStringPermission(currentUser.getPerms());
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行了=>认证doGetAuthorizationInfo");
//用户名,密码,从数据库中去取
UsernamePasswordToken userToken = (UsernamePasswordToken) token;
User user = userService.queryUserByName(userToken.getUsername());
if(user==null){
return null; //抛出异常
}
Subject currentSubject = SecurityUtils.getSubject();
Session session = currentSubject.getSession();
session.setAttribute("loginUser",user);
//可以加密,MD5 MD5盐值加密(在md5后面又加了一些东西)
//验证密码,shiro做 加密了
return new SimpleAuthenticationInfo(user,user.getPwd(),"");
}
}
- ShiroConfig
@Configuration
public class ShiroConfig {
//shiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("SecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加shiro的内置过滤器
/*
* anno无需认证就可以访问
* authc:必须认证了才能访问
* user:必须拥有记住我 功能才能用
* perms:拥有对某个资源的权限才能访问
* role:拥有某个角色的权限才能访问
* */
//拦截
Map<String,String> filterMap=new LinkedHashMap<>();
// filterMap.put("/user/add","authc");
// filterMap.put("/user/update","authc");
//授权,正常的未授权会跳到未授权的页面
filterMap.put("/user/add","perms[user:add]");
filterMap.put("/user/update","perms[user:update]");
filterMap.put("/user/*","authc");
bean.setFilterChainDefinitionMap(filterMap);
//设置登录的请求
bean.setLoginUrl("/toLogin");
//未授权页面
bean.setUnauthorizedUrl("/noauth");
return bean;
}
//DefaultWebSecurityManager:第二步
@Bean(name="SecurityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager SecurityManager = new DefaultWebSecurityManager();
//需要关联UserRealm
SecurityManager.setRealm(userRealm);
return SecurityManager;
}
//创建realm对象,需要自定义:第一步
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
//整合shiro Dialect:用来整合shiro和thymeleaf
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
}
并用一些简单页面跳转进行测试
- 这个用户只有update权限
- 这个用户只有add权限
- 下载本文的shiro实战完整代码链接:https://download.csdn.net/download/shooter7/37712708