直接看下代码结果
user目录下。还有add.html和update.html两个页面
引入依赖
<!--集成jdbc和mybatis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!--引入shiro框架 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
<!--thyleaf整合shiro-->
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>2.0.0</version>
</dependency>
一个实体类Users,两个表users和权限prems表
看下javabean文件
users类
@Data
public class Users {
private Integer id;
private String name;
private String pwd;
private Integer prems_id;//权限id
}
创建数据库sql语句的mapper
@Component
public interface UserMappers {
@Select("select *from user where name=#{name}")
Users selectByName(@Param("name") String name);
@Select("select prems_name from prems where id=#{id}")
String selectFindPrems(@Param("id") Integer prems_id);
}
创建一个serivce
@Service
public class UsersSerivce {
@Autowired
private UserMappers userMappers;
//根据用户名查找用户的信息
public Users findByNameUsers(String name){
Users users=userMappers.selectByName(name);
return users;
}
//根据用户的权限prems_id去查找对应的权限## 标题
public String findUserPrems(Integer prems_id){
String prems_name=userMappers.selectFindPrems(prems_id);
return prems_name;
}
}
准备工作结束进入正题‘
创建contrller–起始只要tologin一个请求(我这里的请求是项目全部写完的,正常来说需要哪个写那个,拦截器的请求根据自己需要在写)
@Controller
public class MyContreller {
@GetMapping({"/","/index"}) //两个请求都可以进入
public String toIndex(){
return "index";
}
@GetMapping("/user/add")
public String add(){
return "user/add"; //返回user目录下的add页面
}
@GetMapping("/user/update")
public String update(){
return "user/update"; //返回user目录下的add页面
}
@GetMapping("/tologin")
public String toLogin(){
System.err.println("进入");
return "login";
}
@GetMapping("/login")
public String login(@RequestParam("username")String username,
@RequestParam("password")String password,
Model model){
//获取当前用户
Subject subject= SecurityUtils.getSubject();
//封装用户数据
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
//执行登录方法,,如果没有异常就说明登录成功
subject.login(token); //执行这个就会执行UserRealm 的doGetAuthenticationInfor认证方法 。。根据返回的结果进行异常捕获
return "/index"; //登录成功进入的请求
}catch (UnknownAccountException e){
//账号错误
model.addAttribute("msg","用户名不正确");
return "login";//返回登录页面
}catch (IncorrectCredentialsException e){
//密码错误
model.addAttribute("msg","密码不正确");
return "login";//返回登录页面
}
}
//未授权页面
@GetMapping("/noauth")
@ResponseBody
public String unauuothorizefd(){
return "未授权不可以访问";
}
}
创建一个UserRealm类继承AuthorizingRealm,其中有两个方法,一个是认证,一个是授权
public class UserRealm extends AuthorizingRealm {
@Autowired
private UsersSerivce usersSerivce;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.err.println("执行授权");
/*
* 数据库用户mashuai 权限:可以进入/user/add请求
* 用户amdin 权限:可以进入/user/upadate请求
* 用户zs 权限:以上两种请求都不可以
* */
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
//info.addStringPermission("look_add"); //默认给每个用户添加这个look_add权限
//取出来当前的用户
Subject subject= SecurityUtils.getSubject();
Users currentUser = (Users) subject.getPrincipal();//取出当前用户
//根据当前用户的prems_id查找出对应的权限+
String prems_name=usersSerivce.findUserPrems(currentUser.getPrems_id());
info.addStringPermission(prems_name);//为用户添加权限
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.err.println("执行认证");
//取出 subject.login(token);里面的token AuthenticationToken authenticationToken的对象就是封装号的用户账号密码
UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;
//从数据库取所有的账号面密码进行匹配
Users users=usersSerivce.findByNameUsers(userToken.getUsername());
//shiro不需要自己手动密码验证。如果密码错误会自己返回IncorrectCredentialsException异常
if (users==null){
return null;//如果查找不到就说明账号不存在。。会抛出UnknownAccountException错误
}
//这个地方就是登录成功的地方。可以把用户的的信息放进session或者cokies中,进行持久化
//放进Shiro自带的sesion
Subject curenntSubject=SecurityUtils.getSubject();
Session session= curenntSubject.getSession();
session.setAttribute("loginUsers",users);
//将用户的唯一标识写入浏览器的cokies
return new SimpleAuthenticationInfo(users,users.getPwd(),"");
//三个参数:(存放当查询出来的用户对象用户授权认证,用户的密码,)
}
}
创建ShiroConfig类,进行注入
@Configuration
public class ShiroConfig {
//注入ShiroFilterFactriryBEa过滤器
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean =new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加shiro内置的过滤器
/*
* anon:无需认证即可访问
* authc:必须认证(不被验证直接拦截)
* user:必须有记住我功能才可以用
* role :拥有某个角色权限才可以访问
* perms :权限设置
*
* */
Map<String,String> filterMap=new LinkedHashMap<>();
//权限设置
filterMap.put("/user/add","perms[look_add]");//意思就是说经过/user/add请求的必须有look_add权限
filterMap.put("/user/update","perms[look_update]");//意思就是说经过/user/add请求的必须有look_add权限
filterMap.put("/","authc");//user/*任意请求需要验证
filterMap.put("/user/*","authc");//user/*任意请求需要验证
//设置
bean.setFilterChainDefinitionMap(filterMap);//将拦截授权加入过滤器
bean.setUnauthorizedUrl("/noauth");//未授权的跳传页面
bean.setLoginUrl("/tologin"); //如果请求被拦截跳转的进入的请求
return bean;
}
//注入DafaultWebSecurityManager
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
securityManager.setRealm(userRealm);
return securityManager;
}
//注入realm @Qualifier("userRealm")注解等于@Bean(name="userRealm") 就是绑定这个方法
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
//整合thyleaf和shiro
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
}
创建ShiroConfig类,注入配置
@Configuration
public class ShiroConfig {
//注入ShiroFilterFactriryBEa过滤器
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean =new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加shiro内置的过滤器
/*
* anon:无需认证即可访问
* authc:必须认证(不被验证直接拦截)
* user:必须有记住我功能才可以用
* role :拥有某个角色权限才可以访问
* perms :权限设置
*
* */
Map<String,String> filterMap=new LinkedHashMap<>();
//权限设置
filterMap.put("/user/add","perms[look_add]");//意思就是说经过/user/add请求的必须有look_add权限
filterMap.put("/user/update","perms[look_update]");//意思就是说经过/user/add请求的必须有look_add权限
filterMap.put("/","authc");//user/*任意请求需要验证
filterMap.put("/user/*","authc");//user/*任意请求需要验证
//设置
bean.setFilterChainDefinitionMap(filterMap);//将拦截授权加入过滤器
bean.setUnauthorizedUrl("/noauth");//未授权的跳传页面
bean.setLoginUrl("/tologin"); //如果请求被拦截跳转的进入的请求
return bean;
}
//注入DafaultWebSecurityManager
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
securityManager.setRealm(userRealm);
return securityManager;
}
//注入realm @Qualifier("userRealm")注解等于@Bean(name="userRealm") 就是绑定这个方法
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
//整合thyleaf和shiro
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
}