shiro授权在自定义的realm类里面来实现
public class UserRealm extends AuthorizingRealm {
@Autowired
UserMapper userMapper;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了=>授权doGetAuthorizationInfo");
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermission("user:add");//给所有用户都赋予add权限
//真实情况是,用户的权限user:add是存放在数据库中的,通过从当前用户的信息来判断是否又某些权限
//例如,拿到了当前用户对象currentUser,通过这个对象的属性(存放权限的属性)perms来addStringPermission
//info.addStringPermission(currentUser.getPerms());
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行了=>认证doGetAuthenticationInfo");
//用户名,密码,数据库中取,这里先伪造
// String username = "wt";
// String password = "111111";
UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;
// if (!userToken.getUsername().equals(username)){//如果找不到用户名
// return null;//这个return null 会自动抛出异常(UnknownAccountException)
// }
//从真实的数据库中取数据
if(userMapper.getUserByUsername(userToken.getUsername()) == null){//数据库中查不到用户
return null;
}
//密码认证,shiro来做
return new SimpleAuthenticationInfo("",userMapper.getUserByUsername(userToken.getUsername()).getPwd(),"");
}
}
拦截未授权的用户访问在shiro配置类里实现
@Configuration
public class ShiroConfig {
//ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(defaultWebSecurityManager);//设置安全管理器
//添加shiro的内置过滤器
/*
* shiro的内置过滤器有下面5个功能
* anon:无需认证(登录)就可以访问
* authc:必须认证(登录)了才能访问
* perms:拥有对某个资源的权限才能访问
* role:拥有某个角色权限才能访问
* user:必须拥有 记住我 功能才能用
* */
//开始配置过滤规则
Map<String,String> filterMap = new LinkedHashMap<>();//用个map来存规则
filterMap.put("/user/add","authc");//规定/user/add必须认证(登录)了才能访问(authc)
filterMap.put("/user/update","authc");//规定/user/update必须认证(登录)了才能访问(authc)
//上面两行代码也可写成:
//filterMap.put("/user/*","authc");
filterMap.put("/user/add","perms[user:add]");//规定访问/user/add用户必须拥有add权限(perms)
bean.setFilterChainDefinitionMap(filterMap);//添加自己配置的拦截规则
bean.setLoginUrl("/login");//如果没有登录访问add被拦截,则跳到登录页,设置能跳到登录页的http请求
bean.setUnauthorizedUrl("/unAuthorized");//如果登陆后尝试访问需要权限的页面被拦截,设置跳转到/unAuthorized页面
return bean;
}
//DefaultWebSecurityManager
@Bean(name="securityManager")
public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
//使用@Qualifier指定bean的名字进行自动装配
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(userRealm);//关联manager与userRealm
return securityManager;
}
//创建realm对象,需要自定义类
@Bean(name="userRealm")
public UserRealm getUserRealm(){
return new UserRealm();
}
//配置shiroDialect:用来整合shiro与thymeleaf
@Bean
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
}