目的:前端登录认证后可以进行相关的功能操作,具备访问权限的可访问,否则不可访问
第一步:前端代码
用于登录认证,这里就是上一篇的功能实现
<form action="/login" method="post">
用户名:<input type="text" name="userName">
密码:<input type="password" name="userPassword">
<input type="submit" value="login">
</form>
点击相应的连接进入相应的模块,不过应该要具有相应的权限
进入用户添加功能:<a href="/add">用户添加</a>
进入用户更新功能:<a href="/update">用户更新</a>
第二步:shiroconfig配置类
我在配置中添加了一个授权过滤器,
//授权过滤器
filterMap.put("/add","perms[user:add]");
如上,这表示,对于这个连接请求,只有再具有user:add这个权限后才可以访问
@Configuration
public class ShiroConfig {
/**
* 创建shiroFilterFactoryBean
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
/**
* shiro内置过滤器
* anon:无需认证(登录)就可以访问
* authc:必须认证才可以访问
* user:如哦使用了rememberMe的功能可以直接访问
* perms:该资源必须得到资源权限才可以访问
* role:该资源必须得到相应的角色权限才可以访问
*/
LinkedHashMap<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/login","anon");
filterMap.put("/login.html","anon");
//授权过滤器
filterMap.put("/add","perms[user:add]");
filterMap.put("/*","authc");
//使用通配的方式设置某一个目录的访问级别
/* filterMap.put("/templates","authc");*/
//设置访问被拦截过后的跳转页面
shiroFilterFactoryBean.setLoginUrl("/myError");
//设置未授权提示页面
shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean;
}
/**
* 创建defaultWebSecurityManageer
*/
@Bean(value = "defaultWebSecurityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联我们创建的realm
securityManager.setRealm(userRealm);
return securityManager;
}
/**
* 创建realm
*/
@Bean(value = "userRealm")
public UserRealm getRealm(){
return new UserRealm();
}
}
第三步:自定义realm进行授权控制
public class UserRealm extends AuthorizingRealm {
@Autowired
UserService userService;
/**
* 认证
* @param authenticationToken 令牌
* @return 用户信息
* @throws
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken;
//从数据库中取出用户
User user = userService.getUserByName(token.getUsername());
System.out.println(user);
//判断用户名是否存在
if (user !=null){
if (!token.getUsername().equals(user.getUserName())){
//用户名不存在
return null;
}
//判断密码
return new SimpleAuthenticationInfo(user,user.getUserPassword(),"");
}else {
return null;
}
}
/**
* 授权
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
/*添加授权信息
从数据库中查询并确认用户*/
//获取主体,这个是当时认真的时候传过来的
Subject subject = SecurityUtils.getSubject();
//对主体进行类型转换
User user = (User)subject.getPrincipal();
//通过认证时候的用户名查询到相关用户,并从数据库中查询用户的所有数据
User user1 = userService.getUserByName(user.getUserName());
//将查询出来的用户所具有的权限用来对用户进行授权
info.addStringPermission(user1.getUserPerms());
return info;
}
}
观察下面的授权模块,这里是从数据库中查询出用户所具有的权限,然后对用户进行授权
总结:到这里就已经完成了对用户的动态授权,对于/add这个请求,如果用户没有得到相应的权限就无法访问该地址