登录认证
1、controller
public String login(String name,String password, Model model) {
//1、获取subject
Subject subject = SecurityUtils.getSubject();
//2、封装用户数据
UsernamePasswordToken token = new UsernamePasswordToken(name,password);
//3、执行登录方法
try {
//交给config中的Realm处理--->执行它的认证方法
subject.login(token);
//登录成功
return "redirect:/testThymeleaf";
}catch (UnknownAccountException e){
//登录失败:用户名不存在
model.addAttribute("msg","用户名不存在");
return "user/login";
}catch (IncorrectCredentialsException e){
//登录失败:密码错误
model.addAttribute("msg","密码错误");
return "user/login";
}
}
2、ShiroConfig
@Configuration
public class ShiroConfig {
/**
* 创建ShiroFilterFactoryBean
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
/**
* Shiro内置过滤器,可以实现权限相关的拦截器
* 常用的过滤器:
* anon: 无需认证(登录)可以访问
* authc: 必须认证才可以访问
* user: 如果使用rememberMe功能可以直接访问
* perms: 该资源必须得到资源权限才可以访问
* role: 该资源必须得到角色权限才可以访问
*/
Map<String, String> filerMap = new LinkedHashMap<>();
//注意直接通过登录请求!!!
filerMap.put("/login","anon");
//认证过滤器
filerMap.put("/testThymeleaf","authc");
filerMap.put("/*","authc"); //全部但不包含前面已经指定的页面,第一次匹配优先
//设置登录的页面!!!
shiroFilterFactoryBean.setLoginUrl("/toLogin");
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
return shiroFilterFactoryBean;
}
/**
* 创建DefaultWebSecurityManager安全管理器
*/
@Bean(name = "defaultWebSecurityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
//关联Reaml
defaultWebSecurityManager.setRealm(userRealm);
return defaultWebSecurityManager;
}
/**
* 创建Realm
*/
@Bean(name = "userRealm")
public UserRealm getReaml(){
return new UserRealm();
}
}
3、UserRealm
//继承AuthorizingRealm
public class UserRealm extends AuthorizingRealm {
/**
* 执行授权逻辑
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行授权逻辑");
return null;
}
/**
* 执行认证逻辑
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//获取token
UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken;
User user = userService.findByName(token.getUsername());
//1、判断用户名
if(user == null){
//用户名不存在,shiro底层会抛出UnKnowAccountException
return null;
}
//2、自动判断密码,第1个为Principal,第二位正确的密码,第三为shiro名字
return new SimpleAuthenticationInfo(user,user.getPassword(),getName());
}
}