shiroConfig的写法
@Configuration
public class ShiroConfig {
// ShiroFilterFactoryBean
@Bean(name = "shiroFilterFactoryBean")
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager getDefaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
// 设置安全管理器
bean.setSecurityManager(getDefaultWebSecurityManager);
//添加shiro的内置过滤器
/*
* anon---匿名拦截器----,即不需要登录即可访问,一般用于静态资源过滤。
* authc---基于表单的拦截器,如果没有登录会跳转到相应的登录页面登录。
* user---用户拦截器--用户已经身份验证/记住我登录的都可。
* perms--权限授权拦截器--验证用户是否拥有所有权限
* roles--角色授权拦截器--验证用户是否拥有所有角色
*/
Map<String,String> filterMap=new LinkedHashMap<>();
//授权操作,未授权的话,会跳转到某个页面
filterMap.put("/user/add","perms[user:add]");//直接限制
filterMap.put("/user/*","authc");
bean.setFilterChainDefinitionMap(filterMap);
// 设置登录方式
bean.setLoginUrl("/toLogin");
//未授权的页面
bean.setUnauthorizedUrl("/noauth");
return bean;
}
// DafaultWebSecurityManager
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联UserRealm
securityManager.setRealm(userRealm);
return securityManager;
}
// 创建realm对象,需要自定义一个类:1
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
// 整合shiro和theleaf的整合shiroDialect,
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
}
userRealm的写法
public class UserRealm extends AuthorizingRealm {
@Autowired
UserServiceImpl userService;
@Override//授权验证
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了==>授权的操作doGetAuthorizationInfo1");
//SimpleAuthrizationInfo用于向用户授权的类对象,这里获取对象
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();//将角色和权限信息设置到SimpleAuthorizationInfo
Subject subject = SecurityUtils.getSubject();//获取当前的对象
User principal = (User)subject.getPrincipal();//获得当前对象的唯一标识符号,是任意的形式
//给用户添加权限
info.addStringPermission(principal.getPerms());//获得user权限,并赋予当钱请求需要授权才能访问的资源用户
return info;
将SimpleAuthorizationInfo,即对于用户的授权信息返回,如果我们在上面进行的授权操作授予的权限/用户本身具有的权限包括了请求当前资源的权限,那么资源请求成功,如果不包含就请求失败
}
//那小伙在登录,他已经给我说了他的身份证信息(参数AuthenticationToken),你把那小伙的身份证复印件给我,辨认、放行、驱赶的事交给我了
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行了==>身份验证的操作doGetAuthenticationInfo");
UsernamePasswordToken userToken = (UsernamePasswordToken) token;
User user = userService.queryUserByName(userToken.getUsername());
//连接真是的数据库
if(user==null){
return null;//抛出异常
}
System.out.println("登陆成功");
//密码认证,shiro做,不用你
//return 传出user对象
System.out.println(new SimpleAuthenticationInfo(user,user.getPwd(),""));//user对象h是从数据库中传出
return new SimpleAuthenticationInfo(user,user.getPwd(),"");
}
}